Java 调用方法列表
我有一个场景,根据一个变量的值,我将其他不同的变量设置为null。比如:Java 调用方法列表,java,Java,我有一个场景,根据一个变量的值,我将其他不同的变量设置为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); o
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;
}
setters.entrySet().stream()
.filter(x -> !x.getKey().equals(object.getControllerVariable()))
.forEach(x -> x.getValue().accept(object));
现实生活中的情况比这要长一点,而且在未来可能会增长。我想做的是创建一个包含所有setter的列表,在开关内部删除一个不应该执行的setter,最后用相同的值调用它们。这能做到吗?我想如果你离开开关,你的运气会更好。例如,类似这样的方法可能会起作用:
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) {
...
您可以将所有这些setter存储到一个列表中
我要做的是将它们存储在HashMap
中:
我想你需要像反思这样的东西。 假设您有这样一个类:
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;
}
}
Person person = new Person();
Object result = person.getClass().getMethod("getFirstName").invoke(person);
然后您需要在这个类中执行一个或多个方法,并附带一些条件。
在Java中,我们有一个名为Reflection的API,它支持运行时执行。
在本例中,该类中有两个方法,当我们想要调用它们时,我们有如下代码:
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;
}
}
Person person = new Person();
Object result = person.getClass().getMethod("getFirstName").invoke(person);
通过反射,您可以实例化任何类的实例,使用任何返回类型调用类中的任何方法,或使用任何条件调用输入参数。您的问题让我想起了策略模式。这是。这类似于@Sweeper的回答。我花了几分钟的时间思考如何将其应用于OPs问题。我想你的意思是他可以有一个方法列表,比如
[“setA”,“setB”,“setC”]
,然后使用反射有条件地应用这些方法,例如object.getCLass().getMethod(“setA”)…
。我不确定如何通过反射传递参数,所以应该在回答中说明这一点。也就是说,我认为更好的方法是使用Java 8特性,如Sweeper的回答中所述。