Использование Google Guava Objects.ToStringHelper - PullRequest
52 голосов
/ 25 февраля 2012

Я использовал ToStringBuilder.reflectionToString(class) в commons-lang, чтобы реализовать toString() для простых DTO. Сейчас я пытаюсь использовать Google Guava вместо библиотеки Apache Commons. И я нашел Objects.ToStringHelper в Гуаве. Но это слишком многословно, если в классе много учеников. Например:

@Override
public String toString() {
    return MoreObjects.toStringHelper(this.getClass()).add("name", name)
            .add("emailAddress", emailAddress)
            .add("department", department).add("yearJoined", yearJoined)
            .toString();
}

намного проще, если я использую commons-lang:

@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this);
}

Есть ли лучшие способы реализации toString() с помощью Guava, а не с помощью Commons-Lang?

Документы Guava

Ответы [ 6 ]

109 голосов
/ 25 февраля 2012

У меня есть маленькая хитрость для Гуавы com.google.common.base.MoreObjects.toStringHelper().Я настроил IntelliJ IDEA , чтобы использовать его при автоматической генерации toString() методов.Я полагаю, вы можете сделать то же самое в Eclipse .Вот как это сделать в Intellij :

  • перейти в класс
  • нажать Alt + Вставить вВо всплывающем меню «Создать»
  • выберите toString()
  • , нажмите кнопку «Настройки»
  • , перейдите на вкладку «Шаблоны»
  • создайте новыйшаблон с именем «Guava's MoreObjects.toStringHelper ()» (я сделал это, скопировав шаблон «ToStringBuilder»)
  • изменив шаблон на:

    public String toString() {
    #set ($autoImportPackages = "com.google.common.base.MoreObjects")
        return MoreObjects.toStringHelper(this)
    #foreach ($member in $members)
        .add("$member.name", $member.accessor)
    #end
        .toString();
    }
    
  • сохраните шаблон, закройте окна «Настройки» и «Создать toString ()»

  • Теперь вы можете выбрать шаблон Guava's MoreObjects.toStringHelper() при генерации toString() методов

Когда вы добавляете новое поле в класс, просто сгенерируйте метод toString() (IDEA попросит вас подтвердить, что вы хотите заменить существующий метод toString()).

30 голосов
/ 25 февраля 2012

MoreObjects.toStringHelper предназначен для того, чтобы помочь вам легко писать toString() методы в согласованном формате, но он дает вам контроль над тем, какие поля вы включаете в toString(), и должен иметь производительность, сопоставимую с записью вручную. reflectionToString короче типа, но он не дает вам явного контроля над включенными полями и, в общем, использует отражение. Я не вижу в этом лучшей альтернативы.

В качестве примечания, я думаю, что использование toStringHelper выглядит намного чище, если вы поставите один add вызов на линию.

Документы Guava

11 голосов
/ 26 апреля 2012

Существует плагин http://sourceforge.net/projects/guavaeclipse/ (очень маленький), который может генерировать методы toString (и равнозначен хеш-коду) с использованием классов Guava. Это хорошее решение, потому что сгенерированные методы действительно малы и не загромождают класс.

4 голосов
/ 03 октября 2014

Стоит отметить, что Objects.toStringHelper устарел (будет полностью удален в июне 2016 года) в пользу MoreObjects.toStringHelper. Я скопировал шаблон Guava по умолчанию в моей Intellij IDE в новый, который использует вместо этого MoreObjects. Приветствия.

Документы Guava

3 голосов
/ 08 мая 2015

Из доступных плагинов Eclipse guavaeclipse все еще использует MoreObjects.toStringHelper, но Jenerate использует MoreObjects.toStringHelper и работает как шарм.

Документы гуавы

0 голосов
/ 02 февраля 2017

В Eclipse вы можете создать шаблон (не такой мощный, как IntelliJ https://stackoverflow.com/a/9445402/1301197).Он не будет зацикливаться на всех полях для вас, но вы получите по крайней мере окружающий код

windows > preferences > Java > Editor > Templates

${:import(com.google.common.base.MoreObjects)}
@Override
public String toString() {
    return MoreObjects.toStringHelper(this)
    .add("${field}",${field})
    .toString();
}

Это добавит импорт, и вы получите что-то подобное, если вывведите id в качестве поля.Затем до вас, чтобы добавить оставшиеся поля.

public String toString()
{
    return MoreObjects.toStringHelper(this).add("id", id).toString();
}

Обратите внимание, что, вероятно, есть лучшее решение, используя генератор eclipse toString () и создавая собственный построитель toString ().Но для такого ленивого человека, как я, это слишком много.

Щелкните правой кнопкой мыши, затем source > generate toString() и выберите Custom toString () Builder в стиле кода.

...