Get() в языке перечисления типа Java

У меня есть тип перечисления (скажем, для аргументов sake CarModel), используемый во всем приложении (многочисленные классы).

public enum CarModel {
    DIABLO,
    P911,
    DB7;
}

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

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

Вместо использования операторов switch all-over я хотел бы иметь статические методы, которые можно было бы редактировать в одном месте и позволяло бы поведение, подобное следующему:

String country = CarModel.DIABLO.getCountry() // returns Italy
String manufacturer = CarModel.P911.getManufacturer() // returns  Porsche

Возможно ли это с перечислением (и является перечислением даже для "правильного" способа сделать это?

Ответы

Ответ 1

Вы можете сделать что-то вроде этого.

public enum CarModel {
    DIABLO("Lamborghini", "Italy"),
    P911("Porsche", "Germany");

    private String manufacturer;
    private String country;

    private CarModel(String manufacturer, String country) {
        this.manufacturer = manufacturer;
        this.country = country;
    }

    public String getManufacturer() {
        return manufacturer;
    }

    public String getCountry() {
        return country;
    }
}

Ответ 2

Да, абсолютно. У перечислений могут быть свои собственные методы, и эти методы могут быть специфичными по стоимости. Это выглядит так:

enum CarModel {
    P911 {
        public String getManufacturer() { return "Porsche"; }
    },
    DB7 {
        public String getManufacturer() { return "Aston Martin"; }
    },
    ...
    public abstract String getManufacturer();
}

Конечно, вы можете добавить больше методов.

Ответ 3

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

Таким образом, вы не имеете операторов switch везде (из которых вы можете легко опустить случаи), и у вас есть более надежный и OO-стиле полиморфный.

abstract public int getEngineSize();

DIABLO {
   public int getEngineSize() {
      return 6.3; // whatever it really is...
   }
}

См. здесь для получения дополнительных примеров/обсуждений и т.д.

Ответ 4

Я бы предложил добавить эту информацию непосредственно в ваш список.

Вот так:

public enum CarModel {

    DIABLO("Lambo"),
    P911 ("Porsche");

    private String manufacturer;


    private CarModel(String manufacturer) {
        this.manufacturer = manufacturer;
    }

    public String getManufacturer() {
        return manufacturer;
    }    
}

и в классе вам нужно будет использовать метод getManufacturer

Ответ 5

Кроме того, перечисления могут реализовывать интерфейс. Вы можете добавить несколько методов get(), таких как getMaxSpeed() или getWeight(). Интерфейс может выглядеть как

interface car{
public int getMaxSpeed();
public int getWeight();
}

Ответ 6

Да, это довольно легко сделать:

public enum CarModel {
    DIABLO("rod"),
    P911("jane"),
    DB7("freddy");

    private String name;
    CarModel(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }
}   

Ответ 7

Ха-ха, я рекомендую вам использовать шаблон дизайна Factory.

вы можете сделать CarFactory(), чтобы создать новый модельный автомобиль.

http://en.wikipedia.org/wiki/Factory_method_pattern