2010-11-25 64 views
5

我希望自定義格式的數據結構。 例如我有一個DSjava中的自定義轉換說明符

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

現在,我想將某些轉換說明符與每個這些字段關聯。

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

這樣類似

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

收益率 「A先生住在波士頓」(如果address_instance.city =波士頓)等。

似乎沒有簡單的方法做這個。 java.util.Formatter似乎是最終的。它提供的唯一定製是通過界面Formattable,但是這有助於僅定製's'轉換說明符。 有沒有辦法添加我們的自定義轉換說明符?任何幫助都感激不盡。

感謝,

回答

0

我相信你會需要編寫自己的格式化其中工程你想要的方式。

3

看來有沒有簡單的方法來做到這一點。 java.util.Formatter似乎是最終的。

這是真的,但你仍然可以使用組合。我會做類似如下:

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

難的是要知道如何在不同的格式說明連接到您要輸出的字段。我能想到的第一種方法是提供您自己的ExtendedFormattable界面,每個類應該與ExtendedFormatter一起使用,並且可以爲自定義格式說明符返回相應的值。這可能是:

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

還有註釋,但我認爲這不是一個可行的方法。

示例調用會是什麼樣子:

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

使用ExtendedFormattable從內ExtendedFormatter似乎是相當困難的。你有沒有具體的想法? – baskin 2010-11-26 11:33:17