Каков наилучший стандартный стиль для реализации toString?
У нас есть много объектов, для которых нам нравится реализовать простой toString
для вывода атрибутов объекта. Некоторые из этих атрибутов могут быть сложными объектами.
Есть ли какой-нибудь стандарт или просто лучшая практика для стиля? Я думаю что-то вроде:
[SimpleClassName] { prop1:value, prop2:value }
В этом случае вложенное значение будет выглядеть так:
[SimpleClassName] { prop1:value, prop2:[NestedObject] { prop3:value}}
Мы используем Java, но я нахожу, что задаю один и тот же вопрос на большинстве языков!
Ответы
Ответ 1
Лично я считаю, что сочетание [] и {} не так просто получить немедленное представление об иерархии.
Мне нравится этот формат (и я видел, что он используется в нескольких местах):
SimpleClassName[prop1=value, prop2=value]
SimpleClassName[prop1=value, prop2=NestedObject[prop3=value]]
Также существует возможность добавить идентификатор с @
, например стиль по умолчанию для commons-lang ToStringBuilder
делает это (используя собственный пример):
[email protected][name=John Doe,age=33,smoker=false]
Ответ 2
Я думаю, что формат, созданный Guava MoreObjects.toStringHelper( ) довольно хорошо, но в основном это просто хорошо, если вы используете какой-то согласованный формат:
public String toString() {
return Objects.toStringHelper(this)
.add("prop1", prop1)
.add("prop2", prop2)
.toString();
}
// Produces "SimpleClassName{prop1=foo, prop2=bar}"
Ответ 3
Синтаксис 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"
}
]
}
Ответ 4
Есть ли какой-либо стандарт или просто лучшая практика для стиля?
Нет. "Лучший" вывод для метода toString()
определяется тем, для чего вы хотите его использовать. Является ли это для сериализации состояния объекта в форме, которая позволяет его десериализовать? Это для создания отладочных сообщений? Это для отображения объекта для отображения конечным пользователям?
Если вы хотите разработать собственный стиль для методов debug/logging toString()
, это прекрасно. Но если бы не было требования для этого, я бы не стал беспокоиться. ИМО, это усилия, которые лучше можно потратить в других местах.
Ответ 5
Если у ваших объектов есть что-то, что может быть полезно в качестве идентификатора, я бы выполнил что-то вроде вашего второго примера:
[SimpleClassName:id] { prop1:value, prop2:[NestedObject:id] { prop3:value }}
Где id
- это то, что имеет смысл для того, чтобы этот объект был идентификатором - имя для канонического объекта Person
, первичный ключ для объекта из базы данных и т.д.
Ответ 6
Поскольку вы спросили о том, что другие проекты с открытым исходным кодом, вот как это делает jEdit, который похож на Wouter's:
BufferChanging[what=BUFFER_CHANGING,source=org.gjt.sp.jedit.EditPane[active,global]]
Ответ 7
проверить phps print_r ($ obj, true)
или также serialize() может работать, не знаю точно, для чего это необходимо.
jsons также является чистым решением, особенно если вы хотите импортировать данные в javascript environmentbments
Ответ 8
Не было прямого ответа на вопрос, однако ниже было бы экономить время во время первоначальной разработки:
Отказ от ответственности: используется библиотека Apache Commons.
- Добавьте новый шаблон Eclipse с именем
xreflect
в Java > Editor > Templates
; Добавьте ниже в свой узор textarea:
// ---------- начало шаблона -----------// $ {: Импорт (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
- Просто перейдите к концу класса Java, введите
xreflect
и нажмите Ctrl + Space автоматически для автозаполнения методов equals(), toString() и hashCode().