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


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

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

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

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

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

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

Author: Nicole, 2010-10-16

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]
 24
Author: Wouter Coekaerts, 2018-04-26 07:46:11

Я думаю, что формат, созданный Гуавой, Больше объектов.toStringHelper() довольно приятный, но в основном просто хорошо иметь какой-то согласованный формат, который вы используете:

public String toString() {
  return Objects.toStringHelper(this)
      .add("prop1", prop1)
      .add("prop2", prop2)
      .toString();
}

// Produces "SimpleClassName{prop1=foo, prop2=bar}"
 25
Author: ColinD, 2016-08-25 14:50:23

Синтаксис 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
Author: Brad Mace, 2010-10-15 22:20:03

Существует ли какой-либо стандарт или просто лучшая практика для стиля?

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

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

 2
Author: Stephen C, 2010-10-16 07:35:10

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

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

  1. Добавьте новый шаблон 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 ----------- //
  1. Дать OK, OK
  2. Просто перейдите в конец класса Java, введите xreflect и нажмите Ctrl + Пробел для автозаполнения равен(), строке() и хэш-коду() методы автоматически.
 2
Author: KrishPrabakar, 2018-04-20 10:04:39

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

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

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

 0
Author: zigdon, 2010-10-15 22:37:33

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

BufferChanging[what=BUFFER_CHANGING,source=org.gjt.sp.jedit.EditPane[active,global]]
 0
Author: Brad Mace, 2010-10-15 23:09:48

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

 0
Author: rthrwht, 2010-10-15 23:45:22