是否有任何理由在Java 8中覆盖枚举中的方法

时间:2015-02-02 12:14:32

标签: java enums java-8

正如所指出的here lambda提供了一种非常优雅的方式来指定单个枚举值的行为。

在Java 8之前,我通常将其实现为:

enum Operator {
    TIMES {
        public int operate(int n1, int n2) {
            return n1 * n2;
        }
    },
    PLUS {
        public int operate(int n1, int n2) {
            return n1 + n2;
        }
    };

    public int operate(int n1, int n2) {
        throw new AssertionError();
    }            
}

现在我倾向于使用:

enum Operator {
    TIMES((n1, n2) -> n1 * n2),
    PLUS((n1, n2) -> n1 + n2);

    private final BinaryOperator<Integer> operation;

    private Operator(BinaryOperator<Integer> operation) {
        this.operation = operation;
    }

    public int operate(int n1, int n2) {
        return operation.apply(n1, n2);
    }
}

这显得更加优雅。

我无法想到现在覆盖特定枚举值的方法的原因。所以我的问题是,有没有充分的理由在enum中使用方法覆盖,或者功能界面是否应该首选?

1 个答案:

答案 0 :(得分:5)

如果你看一下this answer总结了在这个enum场景中使用lambda表达式的优点,你可能会注意到这些优点在Java 8之前的版本中都消失了。它既不比旧的专用enum变体更具可读性,也不会提高性能。此外,{8}之前不存在interface BinaryOperator所以它是您需要添加到代码库中以遵循此方法的另一个类。

如果您计划很快切换到Java 8,在Java 8之前的代码中使用此委派方法的主要原因是为了简化迁移。


更新至您更新的问题:

如果您主要关注Java 8用例,我建议在所有enum个案例具有不同的行为时始终使用委派方法,这种行为仍然遵循可以从使用lambda表达式中受益的类似模式,如在你的例子中实现运算符就是这种情况。

一个反例可能是enum,其中大多数都有一个共同的行为,只会被一个或几个案例覆盖。 E.g:

enum Tokens {
    FOO, BAR, BAZ, AND, A, LOT, MORE // etc …

    /** Special Token End-Of-File */
    EOF {
        @Override
        public boolean matches(String input, int pos) {
            return input.length()==pos;
        }
    };

    // all ordinary tokens have the same behavior
    public boolean matches(String input, int pos) {
        return input.length()-pos >= name().length()
          && input.regionMatches(pos, name(), 0, name().length());
    }
}
相关问题