繁体   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