Пользовательские спецификаторы преобразования в Java - PullRequest
5 голосов
/ 25 ноября 2010

Я хочу, чтобы мои структуры данных были отформатированы.например, у меня есть DS

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) 

выдает «Мистер А живет в Бостоне» (если address_instance.city = Бостон) и т. д.

Кажется, что сделать это нелегко.java.util.Formatter, кажется, является окончательным.Единственная настройка, которую он обеспечивает, - через интерфейс Formattable, но это помогает настраивать только спецификатор преобразования 's'.Есть ли способ добавить наши пользовательские спецификаторы преобразования?Любая помощь будет высоко ценится.

Спасибо,

Ответы [ 2 ]

3 голосов
/ 25 ноября 2010

Кажется, нет простого способа сделать это.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 голосов
/ 25 ноября 2010

Полагаю, вам нужно написать собственный форматер, который работает так, как вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...