我想要一个枚举,它提供一个包含新类的构造函数的函数。在Java8之前我曾经写过这样的代码:
enum Fruit1 {
APPLE, BANANA;
public Tree getTree() {
switch (this) {
case APPLE:
return new AppleTree();
case BANANA:
return new BananaTree();
default:
throw new IllegalStateException();
}
}
}
现在,我可以使用 lambda 表达式了。优点是,当添加新的枚举条目时,您不会忘记在 switch 语句中添加某些内容。但我不喜欢代码对我来说看起来更复杂。
enum Fruit2 {
APPLE(AppleTree::new), BANANA(BananaTree::new);
Supplier<Tree> treeSupplier;
Fruit2(Supplier<Tree> treeSupplier) {
this.treeSupplier = treeSupplier;
}
public Tree getTree() {
return treeSupplier.get();
}
}
这只是品味问题还是还有其他原因?我可以使用 lambda 表达式以更好的方式做到这一点吗?
这与 other questions comparing lambda expressions to abstract methods 密切相关,但在这里我想重点关注 switch 表达式,我仍然对它很满意(与 lambda 表达式相比)。
最佳答案
你的第二个片段看起来不错。如果您不这么认为,您可以通过将方法的实现置于枚举常量级别来执行类似的操作:
enum Fruit1 {
APPLE {
public Tree getTree() { return new AppleTree(); }
}, BANANA {
public Tree getTree() { return new BananaTree(); }
};
public abstract Tree getTree();
}
关于包含函数的 java 枚举 - 使用 switch 或 seller 作为成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39891217/