繁体   English   中英

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

[英]Using Non-Static Methods as Enum Properties with Generics

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

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);
    }
}

这样以后我可以有一个类似的方法

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;
}

我在这里遇到两个问题。

  1. doAppleThingdoOrangeThing不是静态方法,理想情况下会保持这种状态,而且我找不到任何方法来创建appleHelperorangeHelper的本地实例以使方法引用起作用。
  2. 即使我将方法设为静态,枚举也不能具有Type参数,因此也无法将Function<String, List<T>> fruitFunction作为字段。

有办法吗? 还是更好的方法呢?

枚举值可以有自己的方法实现。 所以我将其写为:

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);
}

但是,如果要达到枚举实例需要按实例状态的目的,那么拥有的东西将越来越少,而枚举又仅仅是抽象的基类。 最好是采用一种更面向对象的方法,例如使用工厂/飞轮模式,而不是将此类事情与纯粹的枚举联系在一起。 (很难确定,因为问题中的代码显然只是一个简化的示例。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM