Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 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 ----------- //
  1. Дайте OK, OK
  2. Просто перейдите к концу класса Java, введите xreflect и нажмите Ctrl + Space автоматически для автозаполнения методов equals(), toString() и hashCode().