Каков наилучший стандартный стиль для реализации toString? [закрыто]
У нас есть много объектов, для которых мы хотели бы реализовать простой toString
для вывода атрибутов объекта. Некоторые из этих атрибутов сами по себе могут быть сложными объектами.
Существует ли какой-либо стандарт или просто лучшая практика для стиля? Я думаю что-то вроде:
[SimpleClassName] { prop1:value, prop2:value }
В этом случае вложенное значение будет выглядеть следующим образом:
[SimpleClassName] { prop1:value, prop2:[NestedObject] { prop3:value}}
Мы используем Java, но я ловлю себя на том, что задаю один и тот же вопрос на большинстве языков!
8 answers
Лично я нахожу, что сочетание [] и {} не так просто получить непосредственное представление об иерархии.
Мне нравится этот формат (и я видел, как он использовался в ряде мест):
SimpleClassName[prop1=value, prop2=value]
SimpleClassName[prop1=value, prop2=NestedObject[prop3=value]]
Также есть возможность добавить идентификатор с помощью @
, например стиль по умолчанию для commons-lang ToStringBuilder
делает это (используя свой собственный пример):
Person@182f0db[name=John Doe,age=33,smoker=false]
Я думаю, что формат, созданный Гуавой, Больше объектов.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()
определяется тем, для чего вы хотите его использовать. Предназначен ли он для сериализации состояния объекта в форме, позволяющей его десериализовать? Это для создания отладочных сообщений? Это для визуализации объекта для отображения конечным пользователям?
Если вы хотите разработать собственный стиль для своих методов отладки/ведения журнала toString()
, это нормально. Но если только не было требование для этого, я бы не стал беспокоиться. ИМО, это усилия, которые лучше было бы потратить в другом месте.
Не является прямым ответом на вопрос, однако приведенное ниже позволит сэкономить время при первоначальной разработке:
Отказ от ответственности: используется библиотека Apache Commons.
- Добавьте новый шаблон Eclipse с именем
xreflect
вJava > Editor > Templates
; Добавьте ниже в его текстовую область шаблон :
// ---------- template start ----------- //
${:import(org.apache.commons.lang.builder.EqualsBuilder,org.apache.commons.lang.builder.HashCodeBuilder,org.apache.commons.lang.builder.ReflectionToStringBuilder)}
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(
final Object pObj) {
return EqualsBuilder.reflectionEquals(this, 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 + Пробел для автозаполнения равен(), строке() и хэш-коду() методы автоматически.
Если у ваших объектов есть что-то, что может быть полезно в качестве идентификатора, я бы реализовал что-то вроде вашего второго примера:
[SimpleClassName:id] { prop1:value, prop2:[NestedObject:id] { prop3:value }}
Где id
- это все, что имеет смысл для того, чтобы этот объект был идентификатором - имя канонического объекта Person
, первичный ключ для объекта из базы данных и т.д.
Поскольку вы спросили о других проектах с открытым исходным кодом, вот как это делает jEdit, что похоже на Wouter:
BufferChanging[what=BUFFER_CHANGING,source=org.gjt.sp.jedit.EditPane[active,global]]
Проверьте phps print_r($obj, истина) или также сериализовать() может работать, не знаю точно, для чего это нужно. jsons также является чистым решением, особенно если вы хотите импортировать данные в среде javascript