假设我有以下枚举:
public enum Foo {
AAA(new A()::doA),
BBB(new B()::doB),
CCC(new C()::doC),
DDD(new D()::doD);
private Function<String, Number> do;
Foo(Function<String, Number> do) {
this.do = do;
}
public Function<String, Number> getDo() {
return do;
}
}
知道我必须保持getDo
方法具有完全相同的签名。
这很好,如果我执行AAA.getDo().apply("two")
,结果将得到2
。
但是问题在于,每次对do
方法的调用都将始终在A,B,C和D的相同实例上进行。但是,我需要A,B,C或D成为不同的对象(因为这些类都有字段,并且我不希望这些字段在do
方法的每次调用中都保留其值)。
我想到了这样的东西:
AAA(
A.class,
A::doA);
但是在这种情况下,A::doA
不再是A实例上的Function,而是BiFunction,我需要将A实例作为第一个参数传递给它。
但是我的getDo
方法仍然必须返回一个Function,并且我看不到将BiFunction和我的A类转换为实例上的Function的任何方法(我们可以想象:(A::DoA).toFunction(A.class)
这样的东西)
答案 0 :(得分:2)
方法引用new A()::doA
绑定到评估A
来创建new A()::doA
实例时创建的一个Function
对象,即,枚举值{{1 }}正在创建。 AAA
将立即执行,并返回对其new A()
方法的引用,就像您曾经使用过doA()
一样。
解决此问题的方法是使函数本身以不立即运行的逻辑调用构造函数:
someInstanceOfA::doA