java这个枚举是否违反了单一责任原则?
首先,我假设Java枚举应该遵循与常规类相同的实践
我对“单一责任”的含义有点模糊。对于下面的代码,我想知道hasSucceed
方法是否违反了规则,因为它的逻辑超出了保持级别的目的
如果它确实违反了原则,我将如何重构
package foo;
public enum Level {
AWFUL(-4),
TERRIBLE(-3),
POOR(-2),
MEDIOCRE(-1),
FAIR(0),
GOOD(1),
GREAT(2),
SUPERB(3),
LEGENDARY(4);
private final int level;
Level(int level) {
this.level = level;
}
public int getValue() {
return this.level;
}
public boolean hasSucceeded(Level requiredLevel, Level roll) {
return getValue() + roll.getValue() >= requiredLevel.getValue();
}
}
# 1 楼答案
我建议您将已成功的方法的责任交给另一个类,您可以向该类要求其他方法
我更喜欢将枚举与代码或逻辑分开,并将级别enum用作枚举的存储库
# 2 楼答案
您应该考虑更改的原因:HASSUCCEDED的要求更改的原因是否与级别列表的要求不同?这不能仅基于代码来判断,您需要考虑用例。例如,如果levels enum是用于不同游戏项目的库的一部分,那么如果不同游戏需要不同的成功逻辑,则可能会导致问题
请注意,另一个原则the principle of information hiding建议此方法应位于此枚举中,因为其参数也是类型级别的
顺便说一句,将枚举视为类并向其添加方法是完全可以的。这是Java枚举的优点之一