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