代码之家  ›  专栏  ›  技术社区  ›  Ramon jansen gomez

尝试理解Java枚举中函数的用法

  •  1
  • Ramon jansen gomez  · 技术社区  · 5 年前

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

    我的代码示例中有一个接口,我想它是有效的,因为它是一个接口,所以不是对对象实现的直接引用:

    public interface PredicateBuilder<T extends Comparable> {
    
    Predicate generateGreaterThan(PredicateContent<T> predicateContent);
    ...
    }
    

    然后我可以在枚举中这样使用它:

    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会抱怨,因为需要对方法进行静态访问,所以我改为静态方法,它可以工作。为什么会有这种限制?这是因为枚举是静态的,所以它们只能访问静态/引用方法?

    1 回复  |  直到 5 年前
        1
  •  1
  •   dreamcrash    5 年前

    为什么会有这种限制?这是因为枚举是静态的,所以它们只能 访问静态/引用方法?

    不,这是因为调用方法时没有实例化类的实例 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;
            }
        }
      }
    

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

    如果你加上 SomeClass::someMethod someMethod 来自班级 某类