2010-11-25 27 views
5

Quiero que mis estructuras de datos tengan un formato personalizado. p. Tengo un DSEspecificadores de conversión personalizados en java

Address { 
    string house_number, 
    string street, 
    string city, 
    long pin_code, 
} 

Ahora, deseo asociar ciertos especificadores de conversión con cada uno de estos campos.

e.g. house_number -> H 
    street -> S, 
    city -> C, 
    pin_code -> P 
    ... 

Así que algo como

myPrintWriter.printf("Mr A lives in %C", address_instance) 

rendimientos "Un señor vive en Boston" (si address_instance.city = Boston), etc ..

Parece que no hay manera fácil de hacer esta. java.util.Formatter parece ser final. La única personalización que proporciona es a través de la interfaz Formattable, pero eso ayuda a personalizar el especificador de conversión 's' solamente. ¿Hay alguna forma de agregar nuestros especificadores de conversión personalizados? Cualquier ayuda será muy apreciada.

Gracias,

Respuesta

0

Creo que usted tendrá que escribir su propio formateador que funciona de la manera deseada.

3

Parece que no hay una manera fácil de hacerlo. java.util.Formatter parece ser final.

Es cierto, pero igual puede usar la composición. Me gustaría hacer algo como lo siguiente:

class ExtendedFormatter { 
    private Formatter defaultFormatter; 

    // provide the same methods like the normal Formatter and pipe them through 
    // ... 

    // then provide your custom method, or hijack one of the existing ones 
    // to extend it with the functionality you want 
    // ... 
    public Formatter format(String format, Object... args) { 
     // extract format specifiers from string 
     // loop through and get value from param array 

     ExtendedFormattable eft = (ExtendedFormattable)args1; 
     String specifierResult = eft.toFormat(formatSpecifier); // %C would return city 

     // use specifierResult for the just queried formatSpecifier in your result string 
    } 
} 

La parte difícil es saber cómo conectar los diferentes indicadores de formato a los campos que desee de salida. La primera forma en que puedo pensar es en proporcionar su propia interfaz ExtendedFormattable que pueda implementar cada clase que se debe usar con el ExtendedFormatter, y devolver los valores correspondientes para los especificadores de formato personalizados. Eso podría ser:

class Address implements ExtendedFormattable { 
    public String toFormat(String formatSpecifier) { // just an very simple signature example 
     // your custom return values here ... 
    } 
} 

También hay anotaciones, pero creo que no es una forma muy viable.

Una llamada de ejemplo se vería así:

ExtendedFormatter ef = new ExtendedFormatter(); 
ef.format("Mr A lives in %C", address_instance); 
+0

Usando ExtendedFormattable desde dentro ExtendedFormatter parece bastante difícil. ¿Tenías algo específico en mente? – baskin

+0

@baskin: Agregué un código y comentarios sobre cómo lo haría. – MicSim

Cuestiones relacionadas