2015-03-21 2 views
2

Я несколько новых для перечислений в Java, и я стараюсь, чтобы переопределить ToString(), так что он может вернуть специальные случаи для перечисления с созданием кода для каждого случая:По умолчанию случай в ToString для перечислений

enum TestEnum { 
One, Two, Three, 
Exclamation, Ampersand, Asterisk; 

public String toString() { 
    if (this == Ampersand) return "&"; 
    if (this == Exclamation) return "!"; 
    if (this == Asterisk) return "*"; 
    return null; // return toString(); ??? 
} 

Если я использую toString в качестве оператора return по умолчанию, я, очевидно, получаю StackOverflowError. Есть ли способ обойти это и вернуть любые случаи, не включенные в toString()?

+0

Ваше беспокойство непонятно, почему вы думаете, что получите 'StackOverflowError'? –

+0

@SergeyPauk: Потому что 'return toString();' будет просто вызывать тот же метод рекурсивно. –

+0

ОК, теперь я получил то, что пытается сделать автор, ответьте на это –

ответ

7

Есть ли способ обойти это и вернуть любые случаи, не включенные в toString()?

Я думаю, что вы просто хотите:

return super.toString(); 

Тогда он не будет называть себя - это будет просто использовать суперкласса реализации.

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

enum TestEnum { 
    One, Two, Three, 
    Exclamation("!"), Ampersand("&"), Asterisk("*"); 

    private final String name; 

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

    private TestEnum() { 
     name = super.toString(); 
    } 

    @Override public String toString() { 
     return name; 
    } 
} 

Протестировано:

public class Test { 
    public static void main(String [] args){ 
     for (TestEnum x : TestEnum.values()) { 
      System.out.println(x); 
     } 
    } 
} 

Выход:

One 
Two 
Three 
! 
& 
* 
Смежные вопросы