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