我会尽量保持简短。我正在尝试做这样的事情:
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;
}
我在这里遇到两个问题。
doAppleThing
和doOrangeThing
不是静态方法,理想情况下会保持这种状态,我找不到任何创建appleHelper
和{{1}的本地实例的方法},以使方法引用起作用。orangeHelper
作为字段。有没有办法做到这一点?还是更好的方法呢?
答案 0 :(得分: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);
}
但是,如果要达到枚举实例需要按实例状态的目的,那么拥有的东西就会越来越少,而枚举又仅仅是一个抽象基类。最好是采用一种更面向对象的方法,例如使用工厂/飞轮模式,而不是将此类事情与纯粹的枚举联系在一起。 (很难确定,因为问题中的代码显然只是一个简化的示例。)