使用非静态方法作为具有泛型的枚举属性

Eat*_*age 2 java enums

我会尽量保持这个简短.我正在尝试做这样的事情:

public enum Fruit {
    APPLE("Apple", appleHelper::doAppleThing),
    ORANGE("Orange", orangeHelper::doOrangeThing);

    private String name;
    private Function<String, List<T>> fruitFunction;

    Fruit(String name, Function<String, List<T>> fruitFunction) {
      this.name = name;
      this.fruitFunction = fruitFunction;
    }

    public String getName() {
      return name;
    }

    public <T> List<T> applyFruitFunction(String someString) {
      return fruitFunction.apply(someString);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样以后,我可以有一个像这样的方法

private <T> List<T> doFruitThing(String someString, Fruit fruit) {
    List<T> transformedFruits = fruit.applyFruitFunction(someString);

    if (transformedFruits.isEmpty()) {
        throw new FruitException("There was no fruit of type " + fruit.getName());
    }

    return transformedFruits;
}
Run Code Online (Sandbox Code Playgroud)

我遇到了两个问题.

  1. doAppleThingdoOrangeThing不是静态的方法,最好将保持下去,我无法找到创建的本地实例的任何方式appleHelper,并orangeHelper让方法参考工作.
  2. 即使我要使方法静态,枚举也不能有Type参数,所以没有办法Function<String, List<T>> fruitFunction作为字段.

有没有办法可以做到这一点?或者更好的方法呢?

Dan*_*den 6

枚举值可以有自己的方法实现.所以我写这个:

public enum Fruit {
    APPLE("Apple") {
        private final AppleHelper helper = new AppleHelper();

        @Override
        public <T> List<T> applyFruitFunction(String someString) {
            return helper.doAppleThing(someString);
        }
    },

    ORANGE("Orange") {
        private final OrangeHelper helper = new OrangeHelper();

        @Override
        public <T> List<T> applyFruitFunction(String someString) {
            return helper.doOrangeThing(someString);
        }
    };

    private String name;

    Fruit(String name) {
      this.name = name;
    }

    public String getName() {
      return name;
    }

    public abstract <T> List<T> applyFruitFunction(String someString);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果你需要枚举实例的每个实例状态,你拥有的东西越来越少枚举,更多的只是一个抽象基类.例如,使用工厂/飞轮模式来研究更多面向对象的方法可能会更好,而不是为了这种事情而绑定到纯粹的枚举.(这很难说清楚,因为问题中的代码显然只是一个简化的例子.)