Использование объектов Google Guava.ToStringHelper


Я ToStringBuilder.reflectionToString(class) в commons-lang, чтобы реализовать toString() для простых DTOs. Теперь я пытаюсь использовать 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() С гуавой, а не с commons-lang?

Guava docs

6 52

6 ответов:

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

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

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

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

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

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

Guava docs

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

стоит отметить, что объекты.toStringHelper был осужден (полностью удален в июне 2016 года) в пользу MoreObjects.toStringHelper. Я скопировал шаблон Guava по умолчанию в моей IntelliJ IDE в новый, который использует вместо этого MoreObjects. Овации.

Guava docs

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

Guava docs

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