2012-04-18 15 views
6

Ich habe eine Enumeration erstellt und ich versuche zu ermöglichen, dass meine enum eine Operation String.format unterstützt, die unbegrenzte Anzahl von Parametern erhält, gibt eine Zeichenfolge zurück. Ich konnte nur ein Objekt zurückgeben und nach dieser Methode muss ich eine toString()/Casting machen. Ich vermute, es gibt einen "saubereren" Weg, um es zu tun, oder vielleicht besser die toString() Methode zu überschreiben. Im Grunde wollte ich die toString() Methode unterstützen, schaffte es aber leider nicht, das zu tun, also habe ich diese Methode erstellt. Wie Sie sehen können, heißt es text(..) und nicht toString().Java: enum toString()

Wie kann ich das besser machen? Die ideale Lösung, die ich wollte, war etwas wie toString(..), das einen String zurückgibt.

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

Ich verstehe nicht, was Sie erreichen möchten. Warum sollte diese Methode eine Instanzmethode einer Enumeration sein, da sie nichts aus der enum-Instanz verwendet? –

+1

Wie hängt diese Methode mit Ihrer Enum zusammen? Was willst du genau zurückgeben? – darrengorman

+0

Ich erweiterte meinen Code, ich versuche, eine toString() -Methode mit wenigen gegebenen String-Parametern zu unterstützen. – Popokoko

Antwort

9

ich sehen, wohin du gehst ... ich denke, das ist, was Sie wollen (getestet, und es funktioniert):

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

Für eine Sicht des Design, würde ich nicht veröffentlichen Sie den Text (dh haben Sie den Getter), es sei denn, Sie müssen wirklich - die Tatsache, dass text als Formatzeichenfolge verwendet wird, ist eine Implementierung der Wahl. Ich würde einfach das tun:

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); 
    } 
} 

Nebenbei mag ich wirklich die Idee der Klasse. Habe es noch nicht gesehen.

+0

Tolle Lösung, funktioniert perfekt, ähm, ich war wirklich nah dran, es selbst zu lösen, vielen Dank! – Popokoko

+0

Ich mag diese Idee auch, obwohl ich eine Funktion eher wie 'anEnumValue.format (Object o)' bevorzugen würde. für mich sollte "toString" eine String-Repräsentation des Enum-Werts selbst zurückgeben, so dass "VALUE_A" wie folgt aussehen würde: "aaa bbb ". – thecoshman

+0

@thecoshman das gilt für 'toString()' * ohne * einen Parameter (dh überschreiben Objects impl), aber 'toString()' * mit * Parameter (s) kann tun, was es mag. Es gibt viele Beispiele aus dem JDK, die dieses Muster verwenden, zum Beispiel ['Integer.toString (int)'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer. html # toString (int)). – Bohemian

4

Sie können toString() nicht überschreiben, wenn Sie weitere Parameter übergeben müssen (toString() erhält keine). Einfach eine neue Methode in der Enumeration definieren, überschreiben Sie keine Notwendigkeit zu:

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

Sie diese Methode nicht toString() nennen sollte, würde es verwirrend sein, weil Sie nicht die Zeichenfolgendarstellung des aktuellen Objekts zurückkehren, statt Sie geben eine formatierte Zeichenfolge der Objekte zurück, die als Parameter übergeben wurden. Außerdem sollte die text() Methode getText() heißen, das ist die Java-Konvention.

Besser einen Namen verwenden, der deutlich anzeigt, dass die zurückgegebene Zeichenfolge keine Zeichenfolge ist - es ist eine formatierte Zeichenfolge, die erwartet, dass der Text als Parameter formatiert wird - getAsFormattedText() drückt dies deutlich aus.

+0

Ja, sehr verwirrend, wenn jemand keine Parameter übergeben will, aber den parameterlosen toString bekommt. –