2010-11-25 19 views
5

Ich möchte, dass meine Datenstrukturen benutzerdefiniert formatiert werden. z.B. Ich habe eine DSBenutzerdefinierte Konvertierungsspezifikatoren in Java

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

Nun möchte ich bestimmte Konvertierungsspezifikatoren mit jedem dieser Felder verknüpfen.

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

So dass so etwas wie

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

yields "Herr A lebt in Boston" (wenn address_instance.city = Boston) etc ..

Es scheint, gibt es keine einfache Möglichkeit, zu tun Dies. java.util.Formatter scheint endgültig zu sein. Die einzige Anpassung, die es bietet, ist über die Schnittstelle Formattable, aber das hilft bei der Anpassung der 's' Conversion Specifier nur. Gibt es eine Möglichkeit, unsere benutzerdefinierten Conversion-Spezifikationen hinzuzufügen? Jede Hilfe wird sehr geschätzt.

Danke,

Antwort

0

Ich glaube, Sie müssen Ihre eigenen Formatierer schreiben, wie Sie wollen, funktioniert.

3

Es scheint, es gibt keinen einfachen Weg, dies zu tun. java.util.Formatter scheint endgültig zu sein.

Das stimmt, aber Sie können immer noch Zusammensetzung verwenden. Ich würde so etwas wie das folgende tun:

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

Der schwierige Teil ist zu wissen, wie die verschiedenen Formatangaben auf die Felder befestigen Sie ausgeben möchten. Die erste Möglichkeit, die ich mir vorstellen kann, ist die Bereitstellung Ihrer eigenen ExtendedFormattable Schnittstelle, die jede Klasse, die mit der ExtendedFormatter verwendet werden soll, implementieren kann, und die entsprechenden Werte für Ihre benutzerdefinierten Formatspezifizierer zurückgibt. Das könnte sein:

Es gibt auch Anmerkungen, aber ich denke, das ist kein sehr praktikabler Weg.

Ein Beispielaufruf würde wie folgt aussehen:

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

Mit ExtendedFormattable aus ExtendedFormatter ziemlich schwierig zu sein scheint. Hattest du etwas Bestimmtes im Kopf? – baskin

+0

@baskin: Code und Kommentare hinzugefügt, wie ich es machen würde. – MicSim

Verwandte Themen