我有一种情况,根据一个变量的值,我将其他不同的变量设置为null。像这样:
switch (object.getControllerVariable()){
case "A":
object.setB(null);
object.setC(null);
break;
case "B":
object.setA(null);
object.setC(null);
break;
case "C":
object.setA(null);
object.setC(null);
break;
}
现实生活中的情景比这更长,并且将来可能会增长。我想要做的是创建一个包含所有设置器的列表,在开关内部删除不应该执行的设置,然后在处使用相同的值调用它们。能做到吗?
答案 0 :(得分:3)
您可以将所有这些设置器存储到列表中。
我要做的是将它们存储在HashMap<String, Consumer<TypeOfObject>>
中:
HashMap<String, Consumer<TypeOfObject>> setters = new HashMap<>();
setters.put("A", x -> x.setA(null));
setters.put("B", x -> x.setB(null));
setters.put("C", x -> x.setC(null));
然后您可以执行以下操作:
setters.entrySet().stream()
.filter(x -> !x.getKey().equals(object.getControllerVariable()))
.forEach(x -> x.getValue().accept(object));
答案 1 :(得分:1)
我认为,如果您离开开关,可能会遇到更好的运气。例如,像这样的事情可能起作用:
String skip = object.getControllerVariable();
if (!"A".equals(skip)) {
object.setA(null);
}
if (!"B".equals(skip)) {
object.setB(null);
}
if (!"C".equals(skip)) {
object.setC(null);
}
仍然有些冗长,但是我认为这并没有摆脱。您可以考虑将其包装在一种可读性较高的方法中:
private void nullOtherFields(Thing object, String skip) {
...
答案 2 :(得分:1)
我认为您需要类似Reflection的东西。 假设您有一个这样的课程:
public class Person {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
然后您要在某些条件下执行此类中的一个或多个方法。 在Java中,我们有一个名为Reflection的API,它支持运行时执行。 在这种情况下,我们在此类中有两个方法,当我们要调用它们时,我们将具有如下代码:
Person person = new Person();
Object result = person.getClass().getMethod("getFirstName").invoke(person);
通过反射,您可以实例化任何类的实例,以任何返回类型调用类中的任何方法或以任何条件输入args。