java - 尝试了解 Java 枚举中函数的用法

标签 java enums functional-programming

这是我的问题,为什么枚举需要对引用类的方法进行静态/接口(interface)访问才能工作?

这是我的带有接口(interface)的代码示例,我猜它可以工作,因为它是一个接口(interface),所以不是对对象实现的直接引用:

public interface PredicateBuilder<T extends Comparable> {

Predicate generateGreaterThan(PredicateContent<T> predicateContent);
...
}

然后我可以像这样在 Enum 中使用它:

public enum Condition {
   GREATER_THAN(PredicateBuilder::generateGreaterThan, ">"),
   ...
   public final String operator;
   public final BiFunction<PredicateBuilder, PredicateContent<?>, Predicate> predicate;

   private Condition(BiFunction<PredicateBuilder, PredicateContent<?>, Predicate> predicate, String operator) {
      this.operator = operator;
      this.predicate = predicate;
   }
}

在那种情况下工作完美。

然后我尝试了以下方法:

@Component
public class SomeClass {
   public String someMethod(String param){
      return "Stuff";
   }
/* This works
*      public static String someMethod(String param){
*         return "Stuff";
*      }
*/

   public void applyStuff(TestEnum enum,String param){
       enum.action.apply(param)
   }
   public enum TestEnum{
      OPTION_1(SomeClass::someMethod);
      private Function<String,String> action;
      private TestEnum(Function<String,String> action){
          this.action = action;
      }
   }
}

此时 IDE 会提示,因为需要静态访问该方法,我更改为静态方法并且它可以工作。那么为什么会有这个限制呢?是因为枚举是静态的,所以它们只能访问静态/引用方法吗?

最佳答案

So why this limitation? Its because Enums are static so they only can access static/reference methods?

不,这是因为您在调用方法时没有实例化类 SomeClass 的实例。这导致了问题

Non-static method cannot be referenced from a static context

例如,以下将起作用:

public class SomeClass {

      public String someMethod(String param){
              return "Stuff";
      }
    }
    public enum TestEnum{
        OPTION_1(a -> new SomeClass().someMethod("something"));
        private Function<String,String> action;
        private TestEnum(Function<String,String> action){
            this.action = action;
        }
    }
  }

因为我们初始化了类 SomeClass 的对象( new SomeClass()),因此我们可以使用非静态方法。

如果您添加 SomeClass::someMethod,您就是在明确告诉编译器您想要来自类 SomeClass 的名为 someMethod 的静态方法。

关于java - 尝试了解 Java 枚举中函数的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66297890/

相关文章:

java - 使用 Google Maps API 部署 Android 应用程序时出错

java - 使用静态方法处理最终类

c# - 使用 Key = Enums Name 和 Value = Enums value 使用最佳技术创建键值对列表

java - 使用枚举来保存对象常量

java - 对具有不同属性的java对象数组进行排序

java - Hibernate 复合主键问题

javascript - 将枚举转换为值数组(将所有 JSON 值放入数组中)

ruby - 在功能上找到通过测试的第一个值的映射

r - 用户定义的函数,用于分析多个 csv、创建变量并在 R 中按组对 NA 进行计数

python - 映射每个元素的功能?