![](/img/trans.png)
[英]Why can't the instance member be accessed from the lambda of the enum constructor?
[英]How to call lambda from Enum constructor
我正在尝试设置一个枚举,其中每个枚举值都有一个要调用的自定义方法。 但是,它告诉我方法必须是 static。 有没有办法引用非静态方法?
我的代码看起来像这样
public class Foo {
private enum MyEnum {
TGD410(Foo::doAction);
private MyLambda myLambda;
MyEnum(MyLambda myLambda) {
this.myLambda = myLambda;
}
public void execute(String str1, String str2) {
myLambda.apply(str1, str2);
}
}
public void doAction(String str1, String str2) {
}
@FunctionalInterface
public interface MyLambda{
void apply(String str1, String str2);
}
}
还有其他方法可以做我想做的事吗? 我想我需要传递对 Foo object 的引用,但不确定如何指定,因为this
是指枚举
更新以澄清我正在使用 Springboot。 Foo是一个豆子。 有问题的方法使用了其他一些注入值,这就是为什么它不能是 static。
我正在考虑不使用 Lambda 而是将我的方法放在另一个 POJO(它实现一些通用接口)中,可以实例化
您必须提供Foo
的实例或使方法doAction()
成为static
,否则您无法访问它。 正如错误消息告诉你的那样。
所以你有两个选择:
doAction()
的签名判断似乎是不必要的,因为没有任何迹象表明该方法在某种程度上依赖于Foo
实例的 state (除非你不打算使用Foo
在方法体中的一些属性被省略)。doAction()
的声明中添加static
修饰符。后面的修复是微不足道的,这是应用第一个的方法:
private enum MyEnum {
TGD410(new Foo()); // instance of Foo is provided while initializing enum-member
private MyLambda myLambda;
MyEnum(Foo foo) {
this.myLambda = foo::doAction;
}
public void execute(String str1, String str2) {
myLambda.apply(str1, str2);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.