2014-01-14 3 views
0

У меня этот класс под названием Food.Избегание операторов switch для типов перечислений

Внутри пищи является перечисление 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 случайным образом возвращать одно из значений из моего ENUM.

Проблема, которую я испытываю, заключается в том, что некоторые другие свойства пищи будут зависеть от ее типа (например, размера). Это заставляет меня постоянно проверять, что такое тип продуктов, прежде чем устанавливать его свойства, и я нахожу себя постоянно пишущими операторы switch и просто делая вещи похожими на полный беспорядок.

Я думал о создании подклассов Food вместо использования перечисления, но мне интересно, может ли кто-нибудь увидеть другой способ, поскольку я могу потенциально в конечном итоге с множеством классов, если я это сделаю.

+0

@DoorknobofSnow Извините, я использую Java – Colin

+0

'public class Fruit extend Food ', а затем переопределяет виртуальных участников. Возможно, вам не понадобится один класс для каждого фрукта. –

+0

Создайте перечисление со свойствами типа [Планета] (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html) enum – pauli

ответ

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; } 
} 
0

Сделать метод будет encapulate которым один переключатель. После этого вы будете называть этот метод каждый раз, когда хотите использовать оператор switch. В качестве аргумента метода указывается значение, которое вы хотите сравнить.

public Object doCHeck(String comparableValue) { 

    //do the check 

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

Я думаю, что это лучшее и более чистое решение для вашей проблемы.

0

Я бы не стал жестко кодировать данные. Если вам нужна чистая реализация, ваш код не должен знать о конкретных деталях продуктов. Извлеките его в текстовый файл:

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

Поскольку вы используете Java для поиска JSON или XML lib. Таким образом, у вас есть один класс Food, который получает данные из текстового файла, просто реализуя логику для использования этих различных характеристик.

Бонус: Любой не-программист может изменять статистику или даже добавлять новую еду!

Смежные вопросы