如何避免Java中的开关情况?

如何避免Java中的开关情况?,java,switch-statement,Java,Switch Statement,我正在为JPA实体编写CRUD,我需要实现字段更新。我在每个类的数组中都有一个可更新的字段名列表。我要求用户输入他想要更新的字段名和他想要更新该属性的值。我验证输入的字段名是否对实体的上下文有效,然后,我需要根据属性名更新一些字段。我如何避免在这里使用开关盒? 代码: package com.kindgeek.monitoring.service; 导入com.kindgeek.monitoring.entity.Person; 导入com.kindgeek.monitoring.reposit

我正在为JPA实体编写CRUD,我需要实现字段更新。我在每个类的数组中都有一个可更新的字段名列表。我要求用户输入他想要更新的字段名和他想要更新该属性的值。我验证输入的字段名是否对实体的上下文有效,然后,我需要根据属性名更新一些字段。我如何避免在这里使用开关盒? 代码:

package com.kindgeek.monitoring.service;
导入com.kindgeek.monitoring.entity.Person;
导入com.kindgeek.monitoring.repository.PersonRepository;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.stereotype.Service;
导入java.util.*;
@服务
公共类人员服务{
@自动连线
个人知识库;
公共列表findAll(){
Iterable Iterable=personRepository.findAll();
List persons=new ArrayList();
iterable.forEach(persons::add);
返回人员;
}
公共可选findById(长id){
返回personRepository.findById(id);
}
公共地图添加人(人){
Map response=newhashmap(){
};
personRepository.save(person);
返回响应;
}
公共地图updatePersonAttribute(字符串updateKey、字符串updateValue、Person){
开关(更新键){
案例“”://我需要在这里进行更新
}
}
公共地图更新人员(HashMap personUpdate,长id){
Map response=newhashmap(){
};
Optional personOptional=personRepository.findById(id);
if(personOptional.isPresent()){
Person=personOptional.get();
Set updateKeys=personUpdate.keySet();
for(字符串updateKey:updateKey){
boolean keyValid=Arrays.asList(Person.modifiableAttribute).contains(updateKey);
如果(有效){
字符串updateValue=personUpdate.get(updateKey);
HashMap updateResponse=updatePersonAttribute(updateKey、updateValue、person);
响应.putAll(更新响应);
}
}
}否则{
响应。输入(“错误”、“正确”);
response.put(“errorText”,String.format(“找不到id为%d的人”,id));
}
返回响应;
}
公共长计数(){
return personRepository.count();
}
public void deleteById(长personId){
personRepository.deleteById(personId);
}
}

另外,我认为我需要一些类似触发器类的东西,以及具有如下签名的方法
updateAttribute(NameTrigger Trigger,String newName)
。但是我不知道这是不是一个好方法,如果是,我应该使用手动编写的类还是不使用。下面是一个代码示例,与我的评论一起使用lookup
Map
解析用于给定
updateKey
的更新函数:

import java.util.HashMap;
导入java.util.Map;
导入java.util.function.BiConsumer;
类别62323277{
静态类MyProcessor{
私有映射处理器=新的HashMap();
{
processors.put(“name”,this::setName);
processors.put(“lastName”,this::setLastName);
}
公共无效更新(字符串键、字符串值、个人){
//托多:也许你可以看看地图
处理器.get(key).accept(person,value);
}
私有void setName(Person,字符串值){
person.setName(值);
}
私有void setLastName(Person,字符串值){
//忽略空值(例如)
如果(值==null){
回来
}
person.setName(值);
}
}
静态类人{
私有字符串名称;
私有字符串lastName;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getLastName(){
返回姓氏;
}
public void setLastName(字符串lastName){
this.lastName=lastName;
}
}
}

我建议您对键使用枚举,并使用
EnumMap
,因为与
HashMap
相比,它们具有更好的性能特性(类似完美的散列,没有冲突等-基本上只是索引数组访问)

您可以通过不使用它们来避免它们。删除它并用条件语句替换它我理解,但在较低的级别上几乎是一样的。您可以使其非静态地访问函数以进行更复杂的处理。然后,从逻辑上讲,这在某种程度上是关于声明与“实际代码”的相同,我喜欢
Map
more的声明性方法(主观ofc)尽管我建议使用enum作为键,使用
EnumMap
进行超快速查找。一些pendantics需要在
开关上进行测试覆盖,而在
映射方法中不需要这种覆盖。但是,是的,从根本上讲,所有类型的案例都是相同的;)我可以让它不作废吗?
BiFunction
:)(取一个人和一个字符串,返回一个人)