繁体   English   中英

传递多级对象方法作为参数

[英]Pass multilevel object method as a parameter

如果我的方法调用是:

obj.getLevelOne().getLevelTwo().getValue();

我想将此方法作为以下参数传递:

boolean checkValue( obj, method , value) 
{
   return obj.method() == value;
}

我想这样调用checkValue方法:

checkValue(obj, "getLevelOne().getLevelTwo().getValue", value);

我有什么办法可以做到这一点? 请帮忙。

在Java中,函数不是一流的概念(但Java 8中已经出现)。 因此,不可能像许多其他具有功能概念的语言一样传递方法。

您需要做的是声明一个接口,并使用一个匿名内部类实现它。 例如

介面

interface MyGetter {
    Object doGet();
}

检查方法

boolean checkValue(MyGetter getter, Object value) {
    return getter.doGet().equals(value);
}

电话

checkValue(new MyGetter() {
    public Object doGet() {
        return obj.getLevelOne().getLevelTwo().getValue();
    }
}, 5);

我们实际上在调用中所做的就是创建一个新类和一个该类型的对象来进行您实际需要的调用。

编辑:

如果需要不同的返回类型,则可以使接口和检查方法通用,例如

介面

interface MyGetter<T> {
    T doGet();
}

检查方法

<T> boolean checkValue(MyGetter<? extends T> getter, T value) {
    return getter.doGet().equals(value);
}

电话

checkValue(new MyGetter<SomeClass>() {
    public SomeClass doGet() {
        return obj.getLevelOne().getLevelTwo().getValue();
    }
}, 5); 

如果您真的想做这样的事情,我建议:

1.使用Callable并创建匿名子类。 注意:这与上面“ MyGetter”给出的方法有些相似,不同之处在于它使用Callable。 不需要我们自己的界面,因为我们可以使用jdk中内置的用于此目的的东西。

 public <T> boolean checkValue(Callable<T> valueGetter, T value) { return value.equals(valueGetter.call()); } final MyObject obj = new MyObject(); checkValue(new Callable<String>() { public String call() { return obj.getLevelOne().getLevelTwo().getValue(); } }, "foo"); 

2.使用某种形式的EL软件包(mvel作为嵌入式库很好用)。

然后,您可以执行:“ levelOne.levelTwo.value”作为表达式,并使用mvel对“ obj”求值。

public <T> boolean checkValue(Object obj, String expression, T value) {
    Object objVal = MVEL.eval(expression, obj);
    return value.equals(objVal);
}
checkValue(obj, "levelOne.levelTwo.value", "foo");

当然,第一个更加类型安全,尽管您的“表达式”将在编译时完成,因为您已将其明确编码为可调用的实现。 第二种方法更具动态性,可让您在运行时计算表达式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM