вторник, апреля 20, 2010

Apache Commons Lang - ToStringBuilder, формирование строки и форматы

Для определённости, возьём такой простой класс:

class Book {
    private String title;
    private String author;
    private Double price;
    private Date   publDate; 
    ... 
}


Я хочу для этого класса получить toString-like отображение.
Удобный для этого способ - взять и применить ToStringBuilder из библиотеки apache commons lang.

Полное имя этого класса -  org.apache.commons.lang.builder.ToStringBuilder.

Способ №1 - руками переопределить метод toString и, с помощью этого класса, описать способ конструирования строкового отображения объектов. Ничего особо примечательного здесь нет, за исключением удобства, которое добавляет упомянутый ToStringBuilder.

    @Override
    public String toString() {
        return new ToStringBuilder(this)
          .append("title", title)
          .append("author", author)
          .append("price", price)
          .append("date", publDate)
          .toString();
      } 


А вот вид получаемой строки зависит от заданного на момент вызова стиля (формата). Примеры этих форматов - чуть низже.

Способ №2 интереснее - он использует reflection. В этом случае мне достаточно вызвать ToStringBuilder.reflectionToString(мой-объект), не занимаясь перечислением имён полей и их значений вручную.

Например, для такого случая

  Book book = new Book();
  book.setAuthor("Gregory M.");
  book.setTitle("The Secret Book of Secrets");
  book.setPrice(15.03);
  book.setPublDate(null); // это специально, чтобы явно показать null-значение


вызов

  System.out.println(ToStringBuilder.reflectionToString(book));

вернёт такой вот результат:
>>> javaapplication243.Book@10b30a7[title=The Secret Book of Secrets,author=Gregory M.,price=15.03,publDate=] 

Да, вот эти >>> я добавил в результат сам, для удобства (моего) при чтении.

Есть несколько способов повлиять на формат получаемого результата.
Результат, показанный чуть выше, получен при использовании формата, используемого по-умолчанию. Имя этого формата - DEFAULT_STYLE.

Можно руками, вызвав статический метод, указать формат, который я хочу использовать:
  
  ToStringBuilder.setDefaultStyle(ToStringStyle.MULTI_LINE_STYLE);

А можно указать нужный формат явным образом, например, вот так:

  ToStringBuilder.reflectionToString(book, ToStringStyle.MULTI_LINE_STYLE)      

Теперь самое интересное - какие форматы есть и как они влияют на результат.

DEFAULT_STYLE
>>> javaapplication243.Book@10b30a7[title=The Secret Book of Secrets,author=Gregory M.,price=15.03,publDate=]  

MULTI_LINE_STYLE
>>> javaapplication243.Book@10b30a7[
      title=The Secret Book of Secrets
      author=Gregory M.
      price=15.03
      date=
    ]


SHORT_PREFIX_STYLE
>>> Book[title=The Secret Book of Secrets,author=Gregory M.,price=15.03,publDate=]

NO_FIELD_NAMES_STYLE
>>> javaapplication243.Book@10b30a7[The Secret Book of Secrets,Gregory M.,15.03,]

SIMPLE_STYLE
>>> The Secret Book of Secrets,Gregory M.,15.03,         

Комментариев нет: