首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用方法列表

问调用方法列表
EN

Stack Overflow用户
提问于 2018-11-19 19:35:05
回答 3查看 68关注 0票数 3

我有一个场景,根据一个变量的值,我将不同的其他变量设置为null。类似于:

代码语言:javascript
复制
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;
}

现实生活中的场景比这要宽一些,而且将来可能会增长。我想要做的是创建一个与所有设置器一起创建的列表,在开关中删除不应该执行的列表,并以相同的值调用它们。这能做到吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-19 19:59:21

您可以将所有这些设置器存储到一个列表中。

我要做的是把它们存储在HashMap<String, Consumer<TypeOfObject>>中

代码语言:javascript
复制
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));

然后你可以做这样的事情:

代码语言:javascript
复制
setters.entrySet().stream()
    .filter(x -> !x.getKey().equals(object.getControllerVariable()))
    .forEach(x -> x.getValue().accept(object));
票数 3
EN

Stack Overflow用户

发布于 2018-11-19 19:45:22

我想如果你离开一个开关,你会有更好的运气。例如,类似这样的东西可能会奏效:

代码语言:javascript
复制
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);
}

仍然有点冗长,但我认为这是无法逃避的。为了提高可读性,您可以考虑将其包装在一个方法中:

代码语言:javascript
复制
private void nullOtherFields(Thing object, String skip) {
    ...
票数 1
EN

Stack Overflow用户

发布于 2018-11-19 20:05:24

我觉得你需要一些像倒影这样的东西。假设您有这样一个类:

代码语言:javascript
复制
‍‍‍‍‍‍‍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中,我们有一个名为反射的API,它支持运行时执行。在本例中,这个类中有两个方法,当我们想调用它们时,我们有如下代码:

代码语言:javascript
复制
Person person = new Person();
    Object result = person.getClass().getMethod("getFirstName").invoke(person);

通过反射,您可以实例化任何类的实例,用任何返回类型调用类中的任何方法,或者使用任何条件输入args。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53381463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档