У нас есть много объектов, для которых нам нравится реализовать простую 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.
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 ----------- //
OK
, OK
xreflect
и нажмите Ctrl + Space для автоматического определения equals (), toString () и hashCode ().