调用方法列表

时间:2018-11-19 19:35:05

标签: 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);
    object.setC(null);
    break;
}

现实生活中的情景比这更长,并且将来可能会增长。我想要做的是创建一个包含所有设置器的列表,在开关内部删除不应该执行的设置,然后在处使用相同的值调用它们。能做到吗?

3 个答案:

答案 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。