Использование объектов 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?
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
вызов на линию.
есть плагин http://sourceforge.net/projects/guavaeclipse/ (очень маленький), который может генерировать методы toString (и также равен хэш-коду) с использованием классов Guava. Это хорошее решение, потому что сгенерированные методы действительно малы и не загромождают класс.
стоит отметить, что объекты.toStringHelper был осужден (полностью удален в июне 2016 года) в пользу MoreObjects.toStringHelper. Я скопировал шаблон Guava по умолчанию в моей IntelliJ IDE в новый, который использует вместо этого MoreObjects. Овации.
из доступных плагинов Eclipse, guavaeclipse по-прежнему использует MoreObjects.toStringHelper, но Jenerate использует MoreObjects.toStringHelper и работает как шарм.
в 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 внутри стиля кода.