包含函数的 java 枚举 - 使用 switch 或 seller 作为成员变量

标签 java lambda enums java-8 switch-statement

我想要一个枚举,它提供一个包含新类的构造函数的函数。在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/

相关文章:

java - 如何在离开方法之前等待回调(Java)

java - 在 Google App Engine 上安排备份

python - 要么对数值进行操作,要么用 nan 替换单元格

java - 将 Java Stream 过滤为 1 个且仅 1 个元素

Java 枚举 : Instantiate Enum "dynamically" (more like a class constructor) to use with Jackson

php - 使用 enum mysql php 切换按钮值

java - 使用具有字符串资源的枚举填充 Spinner

java - Hibernate:必须声明元素类型 "hibernate-configuration"。无迁移

java - 在 Spring 3 中,Web 感知应用程序上下文是什么意思

c# - 构建具有多个参数的 GroupBy Lambda 表达式