2012-04-18 10 views
6

Utworzyłem wyliczenie i próbuję zezwolić, aby moje wyliczenie obsługi operacji String.format, która otrzyma nieograniczoną liczbę parametrów, zwróci ciąg znaków. Udało mi się tylko zwrócić obiekt i po użyciu tej metody muszę wykonać rzutowanie na toString(). Zgaduję, że istnieje bardziej "czysty" sposób, aby to zrobić, lub może lepiej zastąpić metodę toString(). Zasadniczo chciałem wspierać metodę toString(), ale niestety nie udało mi się tego zrobić, więc stworzyłem tę metodę. Jak widać, nazywa się to text(..), a nie toString().Java: enum toString()

Jak mogę to zrobić lepiej? Idealnym rozwiązaniem, które chciałem było coś w rodzaju toString(..), które zwraca String.

public enum MY_ENUM { 

    VALUE_A("aaa %s"), VALUE_B("bbb %s"); 

    private String text; 

    MY_ENUM(String text) { 
     this.text = text; 
    } 

    public String text() { 
     return this.text; 
    } 

    public Object text(final Object... o) { 
     return new Object() { 
      @Override 
      public String toString() { 
       return String.format(text(), o); 
      } 
     }; 
    } 
} 
+3

Nie rozumiem, co chcesz osiągnąć. Dlaczego ta metoda jest metodą instancji wyliczenia, ponieważ nie używa ona niczego z instancji wyliczającej? –

+1

Jak ta metoda jest powiązana z twoim wyliczeniem? Co chcesz, aby zwracał dokładnie? – darrengorman

+0

Rozszerzyłem mój kod, próbując wesprzeć metodę toString() z kilkoma podanymi parametrami string. – Popokoko

Odpowiedz

9

widzę, gdzie idziesz ... myślę, że to jest to, co chcesz (przetestowane i działa):

public String toString(Object... o) { 
    return String.format(text, o); 
} 

Dla punktu widzenia projektu, nie będę publikuje tekst (tzn. Ma getter), chyba że naprawdę musisz - fakt, że text jest używany jako ciąg formatujący, jest wyborem implementacji. Chciałbym po prostu to zrobić:

public static enum MY_ENUM { 

    VALUE_A("aaa %s bbb %s"), 
    VALUE_B("bbb %s"); 

    private final String text; 

    MY_ENUM(String text) { 
     this.text = text; 
    } 

    public String toString(Object... o) { 
     return String.format(text, o); 
    } 
} 

Tak na marginesie, bardzo podoba mi się pomysł z klasy. Nie widziałem tego wcześniej.

+0

Świetne rozwiązanie, działa idealnie, erm, byłem bardzo blisko samemu rozwiązać, wielkie dzięki! – Popokoko

+0

Podoba mi się też ten pomysł, chociaż wolałbym używać funkcji bardziej podobnej do 'anEnumValue.format (Object o)'. dla mnie "toString" powinien zwracać ciąg znaków reprezentujący wartość enum, więc 'VALUE_A' będzie jak" aaa bbb ". – thecoshman

+0

@thecoshman, który jest prawdziwy dla 'toString()' * bez * parametru (np. Przesłanianie Object imp), ale 'toString()' * z * parametrami może robić to, co mu się podoba. Istnieje wiele przykładów z JDK, które używają tego wzorca, na przykład ['Integer.toString (int)'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer. html # toString (int)). – Bohemian

4

Nie można przesłonić toString(), jeśli trzeba przekazać więcej parametrów (toString() nie otrzymuje żadnych). Wystarczy zdefiniować nową metodę w wyliczenia, nie ma potrzeby, aby zastąpić:

public String getAsFormattedText(Object... o) { 
    return String.format(text, o); 
} 

Nie należy nazwać tę metodę toString(), że to być mylące, ponieważ nie jesteś powrocie znaków reprezentujący bieżący obiekt, zamiast zwracasz sformatowany ciąg obiektów przekazywanych jako parametry. Ponadto, metoda text() powinna być nazywana getText(), to jest konwencja Java.

Lepiej użyj nazwy, która wyraźnie wskazuje, że zwracany ciąg nie jest żadnym ciągiem - jest to sformatowany ciąg, który oczekuje, że tekst zostanie sformatowany jako parametr - wyraźnie to wyraża.

+0

Tak bardzo mylące, gdy ktoś nie chce przekazać żadnych params, ale dostaje parametrless toString. –