Подтвердить что ты не робот

Использование 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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Документы Guava

Ответ 3

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

Ответ 4

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

Документы Guava

Ответ 5

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

Документы Guava

Ответ 6

В eclipse вы можете создать шаблон (не такой мощный, как IntelliJ fooobar.com/info/54299/...). Он не будет пересекать все поля участников, но вы получите хотя бы окружающий код

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