簡體   English   中英

如何從枚舉構造函數調用 lambda

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM