2012-04-18 23 views
6

He creado una enumeración y estoy intentando permitir que mi enumeración admita una operación String.format que obtiene un número ilimitado de parámetros y devuelve una cadena. Solo logré devolver un objeto y después de usar este método tengo que hacer un toString()/casting. Supongo que hay una manera más "limpia" de hacerlo, o quizás para anular mejor el método toString(). Básicamente, quería apoyar el método toString(), pero lamentablemente no pude hacerlo, así que creé este método. Como puede ver, se llama text(..) y no toString().Java: enum toString()

¿Cómo puedo hacer esto mejor? La solución ideal que quería era algo así como toString(..) que devuelve un 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

No entiendo lo que quiere lograr. ¿Por qué hacer de este método un método de instancia de una enumeración, ya que no utiliza nada de la instancia enum? –

+1

¿Cómo se relaciona este método con tu enumeración? ¿Qué quieres que devuelva exactamente? – darrengorman

+0

Extendí mi código, estoy tratando de admitir un método toString() con pocos parámetros de cadena dados. – Popokoko

Respuesta

9

veo a dónde va ... Creo que esto es lo que quiere (probado, y funciona):

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

Para un punto de vista del diseño, yo no publicar el texto (es decir, tener el getter) a menos que realmente lo necesite - el hecho de que text se utiliza como una cadena de formato es una opción de implementación. Simplemente haría esto:

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

Como nota aparte, me gusta mucho la idea de la clase. No lo he visto antes

+0

La gran solución, funciona a la perfección, erm, estaba realmente cerca de resolverlo yo mismo, ¡muchas gracias! – Popokoko

+0

También me gusta esta idea, aunque me gustaría utilizar una función más parecida a 'anEnumValue.format (Object o)'. para mí, 'toString' debería devolver una representación de cadena del valor enum mismo, por lo que 'VALOR_A' sería como" aaa bbb ". – thecoshman

+0

@thecoshman que es verdadero de 'toString()' * sin * un parámetro (es decir, reemplaza la impl de Object), pero 'toString()' * con * parámetro (s) puede hacer lo que quiera. Hay muchos ejemplos del JDK que usan este patrón, por ejemplo ['Integer.toString (int)'] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer. html # toString (int)). – Bohemian

4

No puede anular toString() si necesita pasar más parámetros (toString() no recibe ninguno). Basta con definir un nuevo método en la enumeración, no hay necesidad de anular:

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

No debe llamar a este método toString(), sería confuso porque no se está volviendo la representación de cadena del objeto actual, en vez está devolviendo una cadena formateada de los objetos pasados ​​como parámetros. Además, el método text() se debe llamar getText(), esa es la convención de Java.

Mejor usar un nombre que indique claramente que la cadena devuelta no es ninguna cadena; es una cadena formateada que espera que el texto tenga el formato de un parámetro; getAsFormattedText() lo expresa claramente.

+0

Sí, es muy confuso cuando alguien no quiere pasar ningún parámetro pero obtiene el parámetro toString. –