![](/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.