避免枚举类型的switch语句

时间:2014-01-14 14:02:41

标签: java enums coding-style

我有一个名为Food的课程。

食物内部是枚举FoodType,因此:

public class Food {

public enum FoodType {
    STRAWBERRY, COOKIE, CHILLI, APPLE, BURGER, HOTDOG, PIZZA, LEMON
}
FoodType foodType;
...
}

在我的食物构造函数中,我有这个:

public Food(Vector2 position) {
    ...

    this.foodType=generateFoodType();
}

generateFoodType将从我的枚举中随机返回其中一个值。

我遇到的问题是食物的某些其他特性将取决于其食物类型(例如大小)。这迫使我在设置其属性之前不断检查食物类型是什么,我发现自己不断编写switch语句,只是让事情变得一团糟。

我考虑过创建Food的子类而不是使用枚举,但我想知道是否有人可以看到另一种方式,因为如果我这样做,我可能最终会得到很多类。

4 个答案:

答案 0 :(得分:1)

只需将属性添加到enum值即可。这个问题包含了很多方法:Conveniently map between enum and int / String

您甚至可以向枚举和override them for each value添加方法。

答案 1 :(得分:1)

赋予enum更多权力:它可以拥有您想要的任何属性和方法,每个成员甚至可以在需要时覆盖它们。这是size的简单示例:

public enum FoodType {
  STRAWBERRY(2), COOKIE(4), CHILLI(1), APPLE(8), 
  BURGER(12), HOTDOG(11), PIZZA(18), LEMON(3);

  public final int size;
  private FoodType(int size) { this.size = size; }
}

答案 2 :(得分:0)

制作一个可以封装一个开关的方法。 之后,每次要使用switch语句时都会调用此方法。 您将设置方法的参数作为要比较的值。

public Object doCHeck(String comparableValue) {

    //do the check

    return object; //return a boolean or whatever you want
}

我认为这是解决问题的更好,更清洁的解决方案。

答案 3 :(得分:0)

我不会硬编码数据。如果您想要一个干净的实现,您的代码不应该知道食物的具体细节。将其外包到文本文件中:

Name="Strawberry",
Color="Red",
Size=10

在使用Java时,请查找JSON或XML库。这样你就有一个Food类从文本文件中获取数据,只是实现了使用这些不同统计数据的逻辑。

奖励:任何非程序员都可以更改统计数据甚至添加新食物!