В Java, как я могу получить значение перечисления внутри самого перечисления? - PullRequest
5 голосов
/ 24 февраля 2010

Я хочу переопределить toString() для моего перечисления, Color. Однако я не могу понять, как получить значение экземпляра Color в перечислении Color. Есть ли способ сделать это в Java?

Пример:

public enum Color {
    RED,
    GREEN,
    BLUE,
    ...

    public String toString() {
        // return "R" for RED, "G", for GREEN, etc.
    }
}

Ответы [ 6 ]

17 голосов
/ 24 февраля 2010
public enum Color {
    RED("R"),
    GREEN("G"),
    BLUE("B");

    private final String str;
    private Color(String s){
        str = s;
    }
    @Override
    public String toString() {
        return str;
    }
}

Вы можете использовать конструкторы для Enums. Я не проверял синтаксис, но это идея.

15 голосов
/ 24 февраля 2010

Вы также можете включить тип this, например:

public enum Foo { 
  A, B, C, D 
  ; 
  @Override 
  public String toString() { 
    switch (this) { 
      case A: return "AYE"; 
      case B: return "BEE"; 
      case C: return "SEE"; 
      case D: return "DEE"; 
      default: throw new IllegalStateException(); 
    } 
  } 
} 
4 голосов
/ 24 февраля 2010

Enum.name() - кто бы мог подумать?

Однако в большинстве случаев имеет смысл хранить любую дополнительную информацию в переменной экземпляра, которая установлена ​​в конструкторе.

3 голосов
/ 24 февраля 2010

Используйте super и String.substring():

public enum Color
{
    RED,
    GREEN,
    BLUE;

    public String toString()
    {
        return "The color is " + super.toString().substring(0, 1);
    }
}
0 голосов
/ 24 февраля 2010

Я нашел что-то вроде этого (не проверено):

public enum Color {
RED{
public String toString() {
    return "this is red";
}
},
GREEN{
public String toString() {
    return "this is green";
}
},
...   

}

Надеюсь, это немного поможет!

0 голосов
/ 24 февраля 2010

Java делает это для вас по умолчанию, она возвращает .name () в .toString (), вам нужно только переопределить toString (), если вы хотите что-то РАЗНОЕ от имени. Интересные методы: .name () и .ordinal () и .valueOf ().

Чтобы сделать то, что вы хотите, вы бы сделали

.toString(this.name().substring(1));

Вместо этого вы можете добавить атрибут с именем abbreviation и добавить его в конструктор, добавить getAbbreviation () и использовать его вместо .toString ()

...