java - 设置类变量的最佳方法是什么,它是基于 java 中依赖枚举的某些条件逻辑的枚举?

标签 java enums java-8

我正在尝试根据我需要执行的一些计算或条件逻辑将值从一个枚举映射到另一个枚举,以便为类变量设置正确的枚举值。如何在不使用太多 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 语句。有没有更实用的方法来做到这一点。

最佳答案

像我说的那样使用谓词看起来像这样:

public enum Brand {
    MINI,
    FERRARI,
    PAGANI
}

public enum Engine {
    LEVEL1,
    LEVEL2,
    LEVEL3
}

public class Entry {
    public final Predicate<Car> pred;
    public final Engine engine;

    public Entry(Predicate<Car> pred, Engine engine) {
        this.pred = pred;
        this.engine = engine;
    }
}

public class Car {
    int model;
    int year;
    Engine engine;

    public void carEngineCalculator(Brand b) {
        Car mycar = new Car();

        List<Entry> cases = new ArrayList<>();
        cases.add(new Entry(c -> c.isSuperCar(b) && c.isCrazyGood(b), Engine.LEVEL1));
        cases.add(new Entry(c -> c.isSuperCar(b) && !c.isCrazyGood(b), Engine.LEVEL2));
        cases.add(new Entry(c -> !c.isSuperCar(b), Engine.LEVEL3));

        mycar.engine = cases.stream().filter(x -> x.pred.test(mycar)).findFirst().get().engine;

    }

    public boolean isSuperCar(Brand b) {
        if ((b == Brand.FERRARI) || (b == Brand.PAGANI)) {
            return true;
        }
        return false;
    }

    public boolean isCrazyGood(Brand b) {
        return false;
    }
}

您创建一个包含谓词和结果的列表,并使用流、过滤器和 findFirst 遍历列表并找到正确的结果。如果条件比您不需要谓词更简单,那么测试它会有点不同。

关于java - 设置类变量的最佳方法是什么,它是基于 java 中依赖枚举的某些条件逻辑的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52731165/

相关文章:

xaml - DataTriggerBehavior 不适用于枚举?

java - 为什么我不能用接口(interface)返回枚举?

spring - Autowiring 按类型键入的所有接口(interface)

java - 你能重新平衡一个未知大小的不平衡 Spliterator 吗?

java - 奇数大括号后匹配字符的正则表达式

将输出呈现为源代码的 Java 图像编辑器?

java - 如何根据传递的类型调用枚举方法?

java - 捕获#1-of ? super C 解释为通用接口(interface)中的 C

java - JFrame 中的窗口动画

java - 拆分文本时遇到问题