Каков наилучший стандартный стиль для реализации toString?

У нас есть много объектов, для которых нам нравится реализовать простую toString для вывода атрибутов объекта. Некоторые из этих атрибутов могут быть сложными объектами.

Есть ли какой-нибудь стандарт или просто лучшая практика для стиля? Я думаю, что-то вроде:

 [SimpleClassName] { prop1:value, prop2:value } 

В этом случае вложенное значение будет выглядеть так:

 [SimpleClassName] { prop1:value, prop2:[NestedObject] { prop3:value}} 

Мы используем Java, но я нахожу, что задаю один и тот же вопрос на большинстве языков!

Лично я считаю, что сочетание [] и {} не так просто получить немедленное представление об иерархии.

Мне нравится этот формат (и я видел, как он использовался в нескольких местах):

 SimpleClassName[prop1=value, prop2=value] SimpleClassName[prop1=value, prop2=NestedObject[prop3=value]] 

Также есть возможность добавить идентификатор с @ , например, стиль по умолчанию для Commons-lang ToStringBuilder делает это (используя собственный пример):

 Person@182f0db[name=John Doe,age=33,smoker=false] 

Я думаю, что формат, созданный Guava 's MoreObjects.toStringHelper () , довольно приятный, но в основном просто полезно иметь некоторый согласованный формат, который вы используете:

 public String toString() { return Objects.toStringHelper(this) .add("prop1", prop1) .add("prop2", prop2) .toString(); } // Produces "SimpleClassName{prop1=foo, prop2=bar}" 

Синтаксис json кажется очень хорошим, так как он был разработан специально для представления сложных объектов в виде строк

 Person = { "firstName": "John", "lastName": "Smith", "age": 25, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021" }, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] } 

Есть ли какой-нибудь стандарт или просто лучшая практика для стиля?

Нет. «Лучший» вывод для метода toString() определяется тем, для чего вы хотите его использовать. Является ли это для сериализации состояния объекта в форме, которая позволяет его десериализовать? Это для создания отладочных сообщений? Это для отображения объекта для отображения конечным пользователям?

Если вы хотите разработать собственный стиль для методов debug / logging toString() , это нормально. Но если бы не было требования для этого, я бы не стал беспокоиться. ИМО, это усилия, которые можно было бы лучше потратить в другом месте.

Если у ваших объектов есть что-то, что может быть полезно в качестве идентификатора, я бы выполнил что-то вроде вашего второго примера:

 [SimpleClassName:id] { prop1:value, prop2:[NestedObject:id] { prop3:value }} 

Если id имеет значение для того, чтобы этот объект был идентификатором – имя для канонического объекта Person , первичный ключ для объекта из базы данных и т. Д.

Поскольку вы спрашивали о том, что другие проекты с открытым исходным кодом, вот как это работает jEdit, что похоже на Wouter's:

 BufferChanging[what=BUFFER_CHANGING,source=org.gjt.sp.jedit.EditPane[active,global]] 

проверить phps print_r ($ obj, true) или также serialize () может работать, не знаю точно, для чего это необходимо. jsons также является чистым решением, особенно если вы хотите импортировать данные в javascript environmentbments

Не прямой ответ на вопрос, однако ниже было бы экономить время во время первоначальной разработки:

Отказ от ответственности: используется библиотека Apache Commons.

  1. Добавить новый шаблон Eclipse с именем xreflect в Java > Editor > Templates ; Добавьте ниже в свой узор textarea:

// ———- начало шаблона ———– // $ {: import (org.apache.commons.lang.builder.EqualsBuilder, org.apache.commons. lang.builder.HashCodeBuilder, org.apache.commons.lang.builder.ReflectionToStringBuilder)} / * * (не-Javadoc) * @see java.lang.Object # equals (java.lang.Object) * / @Override public boolean equals (final Object pObj) {return EqualsBuilder.reflectionEquals (это, pObj); }

 /* * (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return ReflectionToStringBuilder.toString(this); } /* * (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); } // ---------- template end ----------- // 
  1. Дайте OK , OK
  2. Просто перейдите к концу класса Java, введите xreflect и нажмите Ctrl + Space для автоматического определения equals (), toString () и hashCode ().