2013-10-03 4 views
6

Допустим, вы имеете следующий перечисление:Java - перечисление valueOf «переопределить» именования

public enum Color { 
    RED("R"), GREEN("G"), BLUE("B"); 
    private String shortName; 

    private Color(String shortName) { 
     this.shortName = shortName; 
    } 

    public static Color getColorByName(String shortName) { 
     for (Color color : Color.values()) { 
      if (color.shortName.equals(shortName)) { 
       return color; 
      } 
     } 
     throw new IllegalArgumentException("Illegal color name: " + shortName); 
    } 
} 

Поскольку перечисление является частным случаем, когда вы не можете просто переопределить функцию valueOf, что такое соглашение об именовании для обойти это и реализовать valueOf (String name)?

getColorByName(String name) 
getValueOf(String name) 
permissiveValueOf(String name) 
customValueOf(String name) 
forName(String name) 
getEnum(String name) 
getColor(String name) 

Позже Edit: я вижу, что Блох в Effective Java 2-е изд. предлагает что-то в строках getInstance() (глава 1, пункт 1). Просто добавьте еще один вариант.

+5

http://en.wikipedia.org/wiki/Method_overriding#Java Перекрытие метод сохраняет имя. –

+0

Даже перегрузка сохраняет одно и то же имя, но меняет подпись. Это звучит так, будто мы говорим о совершенно разных именах ... –

+5

Ребята ... мы говорим об перечислениях. Вы не можете переопределить valueOf() и values ​​(). Я изменю название, чтобы указать на это. Но, пожалуйста, удалите свои голоса и дайте мне ответ. –

ответ

13

Вы, безусловно, правы, вы не можете переопределить Enum#valueOf(), так как это статический метод класса Enum.

Я не думаю, что существует соглашение об именах. Как уже указывалось, существует несколько примеров в Java:

Я не буду использовать getEnum, так как вы не получаете Enum себя, а скорее стоимость. Использование forName() здесь не подходит, R не является красного цвета.

Я предпочел бы пойти с:

  • fromString(), поскольку это противоположно toString();
  • getColor() для обеспечения совместимости с стандартной библиотекой Java.
+0

Проблема в том, что я не смог найти примеры в спецификации Java Enum. Цвет и класс - это классы, а не перечисления. Таким образом, вы также можете добавить метод valueOf, но вы не можете сделать переключатель (цвет) –

+0

«fromBlah» имеет смысл для меня. Например, см. «Response.Status.fromStatusCode». – jtoberon

+0

Нет стандарта, и это не очень распространено, поэтому вы вряд ли найдете какое-либо сильное соглашение. Если вы не хотите начать возиться с cglib (!) FromString, вероятно, лучше. Конечно, никто не будет смущен, когда они его прочитают. –

1

Я хотел бы использовать пару:

Color fromValue(String value) 
String toValue() 

Это то, что я нашел наиболее подходящий в моих перечислений.

2

Учтите также следующее!

Color fromName(String name); 
Color fromShortName(String shortName); 
Color fromCode(String code); 
Смежные вопросы