Является ли toString () полезным только для отладки? - PullRequest
10 голосов
/ 19 февраля 2009

Кроме того, конечно, их использование с примитивами. Большинство (если не все) реализаций, которые я вижу, полезны только с точки зрения программиста.


РЕДАКТИРОВАТЬ : Я понимаю, что должен переопределить поведение по умолчанию, поэтому я упомянул реализации :). И я получаю значение переопределения в некоторых компонентах, требующих представления String внутри GUI. Однако, по крайней мере, в JDK я вижу лотов реализаций, которые используются только тогда, когда вам нужно отладить экземпляры объекта.

Почему он укоренен в классе Object, поскольку он полезен только для графического интерфейса / отладки? Есть ли другие применения, о которых я не знаю?

Ответы [ 13 ]

17 голосов
/ 19 февраля 2009

Нет, ключ в том, что вы должны переопределить реализацию по умолчанию ToString(), чтобы сделать ее полезной. ToString() может быть отличным способом вывода значения чего-либо обратно в пользовательский интерфейс.

Простой пример: если у вас есть класс Name с тремя строками (First, Middle, Last). У вас может быть метод ToString(), который форматирует его для пользовательского интерфейса: например, «Last, First Middle».

Или класс, в котором хранится математическая операция (значения Left = 2, Right = 3, Result = 6 и оператор enum = Multiply). Звоните ToString(), чтобы получить «2 * 3 = 6».

Однако , вероятно, более распространено использование множества различных To<qualifier>String() методов, таких как класс .NET DateTime. (ToShortDateString(), ToLongDateString(), ToLongTimeString(), ...)

Редактировать: Что касается того, почему он укоренен в классе Object, то просто потому, что ToString() является допустимой операцией для всего .

Кроме того, строки могут быть хорошим способом маршалинга между типами данных или потребителями данных, поскольку они (практически) гарантированно разбираются и не требуют дополнительного кодирования или заботы.

13 голосов
/ 19 февраля 2009

Мое личное предпочтение заключается в том, что toString () не следует никогда использовать для чего-либо, кроме отладки. Если вы хотите создать строку для объекта, предоставьте отдельный метод, который четко документирует ваше намерение (getName (), getDescription () и т. Д.). Никогда не полагайтесь на реализацию toString ().

Проблема в том, что многие разработчики видят toString () как строку уровня отладки и ничего не думают об ее изменении (например, при добавлении или удалении новых полей). Черт, некоторые автоматизированные сборщики toString () используют отражение для генерации toString () из полей.

Я обнаружил, что эти предпочтения хорошо служили мне на протяжении многих лет.

12 голосов
/ 19 февраля 2009

toString () полезно всякий раз, когда вы хотите получить строковое представление объекта. Естественно, это происходит в целях отладки, но также может быть допустимым для вывода результатов операций пользователю.

Например, допустим, у вас есть класс Complex, который обрабатывает комплексные числа. Если вы хотите распечатать их для пользователя в формате, подобном 3 + 2i , это удобно, если они определяют toString (), поскольку вам не нужно каждый раз записывать формат, и результат будет согласованным , Если вы когда-нибудь захотите изменить это представление, например на 3 + 2j , вам нужно только прикоснуться к методу toString () в классе Complex.

Так что toString () также не для целей отладки, но это хороший способ получить согласованные строковые представления ваших объектов.

6 голосов
/ 19 февраля 2009

Все, что я могу сказать, это то, что у меня произошел разрыв кода, когда я изменил toString моего класса для отображения некоторой дополнительной отладочной информации.

Рассматриваемый код представлял собой библиотеку с графическим интерфейсом, в которой было решено использовать значение toString как нечто внутреннее (это было пару лет назад ... я забыл, что именно это было). В результате я больше не использовал эту библиотеку.

Я бы сказал, что, поскольку большая группа людей считает, что toString используется для отладки (независимо от вашего мнения о том, для чего, по вашему мнению, она должна использоваться), проблематично использовать значение, возвращаемое из него в делать что-либо программно (например, анализировать) или отображать это пользователю.

Если вы на 100% контролируете методы toString, тогда делайте все, что вы хотите.

Итак, чтобы ответить на вопрос, никакой toString не только полезен для отладки, вы можете делать с ним все, что захотите. Однако не удивляйтесь, если toString изменится так, что вы будете несчастны.

4 голосов
/ 19 февраля 2009

По моему опыту, toString () не имеет большого значения вне отладки и ведения журнала. Вы не можете зависеть от его формата или содержимого с течением времени, поэтому, кроме того, что вы читаете человека, не зависите от него ни для чего, кроме простейших объектов (таких как примитивные типы объектов). Если имеется несколько элементов данных, ожидайте, что они могут измениться со временем по типу или номеру, и вывод toString () вместе с ним.

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

3 голосов
/ 19 февраля 2009

Я думаю, важно отметить, что люди, которые ответили, упомянув «toString», заметили, что строчные буквы «t» обычно говорят о Java, а люди, которые ответили, упомянув «ToString», обычно ссылаются на C #. Конечно, это относится не ко всем ответам.

По моим собственным наблюдениям (я использую и то, и другое ежедневно), программистам на C # предлагается переопределить «ToString» для отображения полезного текстового представления. Принимая во внимание, что в Java, я не вижу это почти так же. На самом деле, я редко вижу это.

-JP

2 голосов
/ 19 февраля 2009

Во-первых, метод toString должен возвращать удобочитаемое текстовое представление объекта.

Эта проблема возникает в Effective Java как Элемент 10: Всегда переопределять toString.

Он ссылается на Спецификацию Java API для метода Object.toString:

Результат должен быть кратким, но информативное представление, которое является человеку легко читать.

Помимо отладки, переопределение метода toString класса может быть полезно при добавлении объектов в JList или JTable, которые по умолчанию будут использовать toString метод для отображения объекта в виде текстовой формы в списке или таблице.

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

Итак, действительно есть случаи, когда метод toString полезен для случаев, отличных от отладки. Ключ заключается в том, чтобы метод toString возвращал информацию, которая действительно полезна для просмотра человеком, а не реализацию по умолчанию Object.toString, где местоположение объекта используется для его текстового представления.

1 голос
/ 19 февраля 2009

Полезно для

  1. Gui (сложное свойство при использовании PropertyGrid, текст заголовка формы)
  2. DataBinding (вот как это работает)

И любой другой вывод строки.

0 голосов
/ 19 февраля 2009

Помимо того, что все уже сказали, переопределение ToString () также полезно при использовании элементов управления, которые его вызывают. Например, ComboBox:

myComboBox.Items.Add(new MyClass());
// now, whatever ToString() returns is shown in the
// ComboBox, but you can get the object back by through
// the SlectedItem property.
0 голосов
/ 19 февраля 2009

Я использую ToString () тонну для форматов даты и времени.

http://hunterconcepts.com/content/tools/formats/

...