【问题标题】:Using Non-Static Methods as Enum Properties with Generics使用非静态方法作为泛型的枚举属性
【发布时间】:2018-08-21 09:45:19
【问题描述】:

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

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&lt;String, List&lt;T&gt;&gt; fruitFunction 作为字段。

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

【问题讨论】:

标签: java enums


【解决方案1】:

枚举值可以有自己的方法实现。所以我会这样写:

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

但是,如果您需要枚举实例的每个实例状态,那么您所拥有的东西将越来越少,而只是一个抽象基类。最好研究一种更面向对象的方法,例如使用工厂/飞轮模式,而不是为这类事情绑定到纯枚举。 (很难确定,因为问题中的代码显然只是一个简化的示例。)

【讨论】:

  • 现在这是一个解决方案!并且还纠正了错位的构造函数。
  • 这是一个很好的答案!谢谢。但是,由于 doAppleThing 和 doOrangeThing 的实现非常复杂,我希望它们在不同的类中(AppleHelperOrangeHelper)。通过将这些方法设为静态,我可以进行调用,但我想仍然无法使用实例方法进行调用。哦,好的,谢谢!
  • @EaterOfFromage:查看我的最新编辑 -- 我相信这就是你要找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
相关资源
最近更新 更多