Использование 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
Ответы
Ответ 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 внутри стиля кода.