【发布时间】:2018-10-10 00:53:07
【问题描述】:
我正在尝试根据我需要执行的一些计算或条件逻辑将值从一个枚举映射到另一个枚举,以便为类变量设置正确的枚举值。如何在不使用太多 if/else、switch 语句的情况下做到这一点?
Enum BRAND {
MINI, FERRARI, PAGANI
}
还有另一个枚举
Enum ENGINE {
LEVEL1, LEVEL2, LEVEL3
}
我有一个像这样的课程:
Class Car() {
int model;
int year;
Engine engine;
// I want to calculate set the engine depending on the brand based on conditional logic
public carEngineCalculator (Brand b) {
Car mycar = new Car();
if (mycar.isSuperCar(b) {
if (mycar.isCrazyGood(b)) {
mycar.engine = ENGINE.LEVEL1;
} else {
mycar.engine = ENGINE.LEVEL2;
}
} else {
mycar.engine = ENGINE.LEVEL3;
}
... //And the conditions can be more complex
}
public boolean isSuperCar(Brand b) {
if (b.FERRARI || b.PAGANI) {
return true;
}
return false;
}
public boolean isCrazyGood(Brand b) {
return ...;
}
}
为了设置值,可能需要检查多个这样的条件,并且我想避免讨厌的 if/else/switch 语句,如上所示。有没有更实用的方法来做到这一点。
【问题讨论】:
-
您在这里违反了命名约定。类名(枚举就是类!)应该总是以驼峰命名:“Brand”和“Engine”。另外我认为“引擎”不是一个好名字,因为枚举实际上不是描述整个引擎,而是引擎的某种分类。为什么不叫它“EngineLevel”呢? "enuM" 和 "class" 也必须是小写,但我猜这是拼写错误。
-
@Amadán 你是对的。
-
该示例过于笼统,无法给出好的答案,但看起来 BRAND 枚举和 ENGINE 枚举之间存在一对一的映射。如果是这种情况,那么只需让 BRAND 枚举返回其特定的 ENGINE 枚举。
-
您可以创建一个 Map ,其中 Predicate 为 Key,结果 enum-value 作为 value(或 Pairs Predicate/enum-value 列表)。您可以使用 Java 8-streams 来检查这些谓词中的哪一个是正确的并获得所需的枚举值。
-
很好@RalfRenz 我喜欢这个主意。你能举个例子吗?