Java 调用方法列表

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

我有一个场景,根据一个变量的值,我将其他不同的变量设置为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;
}
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的回答中所述。