gpt4 book ai didi

java - 是否有任何理由在 Java 8 中重写枚举中的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:17:15 25 4
gpt4 key购买 nike

正如指出的那样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 中使用方法覆盖,还是应该始终首选功能接口(interface)?

最佳答案

如果你看this answer它总结了在此 enum 场景中使用 lambda 表达式的优势,您可能会注意到这些优势在 Java 8 之前的变体中都消失了。它既没有比旧的专用 enum 变体更具可读性,也没有提高性能。此外,接口(interface) BinaryOperator 在 Java 8 之前不存在,因此您需要将它添加到代码库中以遵循此方法。

如果您打算很快切换到 Java 8,那么在 Java 8 之前的代码中使用这种委托(delegate)方法的主要原因是为了简化迁移。


更新您的问题:

如果您主要关注 Java 8 用例,我建议在所有 enum 用例都有不同的行为时始终使用委托(delegate)方法,这些行为仍然遵循可以从使用 lambda 中获益的相似模式表达式,就像在您的示例中实现运算符时的情况一样。

一个反例是一个枚举,其中大多数都有一个共同的行为,只有在一种或几种情况下才会被覆盖。例如:

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

关于java - 是否有任何理由在 Java 8 中重写枚举中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28277562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com