Использование Google Guava Objects.ToStringHelper

Я использовал ToStringBuilder.reflectionToString(class) в commons-lang, чтобы реализовать toString() для простых DTO. Теперь я пытаюсь использовать Google Guava вместо общей библиотеки Apache. И я нашел 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


person philipjkim    schedule 25.02.2012    source источник
comment
Сейчас все больше людей пытаются использовать Lombok вместо Google Guava stackoverflow.com/questions/54604701/   -  person darw    schedule 27.07.2020


Ответы (6)


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

  • войти в класс
  • нажмите Alt + Insert, чтобы открыть всплывающее меню «Создать».
  • выберите toString()
  • нажмите кнопку «Настройки»
  • перейти на вкладку "Шаблоны"
  • создайте новый шаблон с именем «MoreObjects.toStringHelper()» от Guava (я сделал это, скопировав шаблон «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()).

person Etienne Neveu    schedule 25.02.2012
comment
Я предполагаю, что вы можете сделать то же самое в Eclipse Нет, никаких шансов. - person Sean Patrick Floyd; 26.02.2012
comment
Спасибо, это отлично работает для меня, но мне не хватает многострочного стиля apache commons :'( - person Sebastien Lorber; 11.09.2012
comment
Очень удобно! Спасибо! - person Murat Derya Özen; 14.01.2013
comment
Этот шаблон был добавлен в IntelliJ 12.1 (в сборке 124.567), см. youtrack.jetbrains.com/issue. /IDEA-90598 - person simon04; 17.04.2013
comment
Извините, у меня нет возможности создать метод toString. Я только что обновился до 12.6. У меня есть варианты для генерации кода для: {Конструктора, Getter, Setter, Getter и Setter, equals() и hashcode(), Override Methods...}. Методы переопределения toString() дает мне мой текущий шаблон по умолчанию для любого метода. Где это меню? - person Groostav; 15.10.2013
comment
Вы имеете в виду 12.1.6? Когда я использую Alt + Insert или нажимаю «Код» -> «Создать», я вижу следующее меню: i.imgur .com/nZPf1Rg.png. ToString() внизу открывает меню Generate toString(), где вы можете выбрать один из различных шаблонов. Можете ли вы проверить, что плагин GenerateToString включен в ваших настройках? - person Etienne Neveu; 16.10.2013
comment
Для IntelliJ 13.1.4+ я вижу аналогичный шаблон toString(), который теперь доступен в установке по умолчанию. Отлично. - person kevinarpe; 25.07.2014

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

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

Документация по Guava

person ColinD    schedule 25.02.2012

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

person marek.dominiak    schedule 25.04.2012
comment
Поясняю: этот плагин не идеален - методы toString нельзя генерировать, например, для вложенных классов, но в любом случае в 90% случаев этого достаточно. - person marek.dominiak; 20.05.2012
comment
Хм... Я могу сделать это как-нибудь... Просто выберите имя внутреннего класса и вперед... - person Michael Z; 23.07.2013

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

Документация по Guava

person Morgan Kobeissi    schedule 03.10.2014

Из доступных подключаемых модулей Eclipse guavaeclipse по-прежнему использует MoreObjects.toStringHelper, но Jenerate использует MoreObjects.toStringHelper и прекрасно работает.

Документация по Guava

person James    schedule 08.05.2015
comment
Можете ли вы рассказать немного больше о том, как это помогает? - person Cristik; 08.05.2015
comment
В верхнем принятом ответе обсуждается, как генерировать методы MoreObjects.toStringHelper toString с помощью IntelliJ, но это бесполезно для многих пользователей Eclipse. В других ответах упоминается плагин guavaeclipse, поэтому я попробовал его, но он использует устаревший Objects.toStringHelper. Затем я наткнулся на Jenerate, и это сработало, поэтому я решил поделиться. - person James; 09.05.2015
comment
Спасибо за объяснение, не могли бы вы также добавить его в ответ, где более видно? - person Cristik; 09.05.2015
comment
Привет, спасибо за подсказку с MoreObjects. GuavaEclipsePlugin поддерживает MoreObjects с версии 1.4.0. Пожалуйста, проверьте guavaeclipsehelperteam.github.io - person Alex; 14.07.2015

В 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 внутри стиля кода.

person Ronan Quillevere    schedule 02.02.2017