Является ли toString() полезным только для отладки?

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


EDIT: Я понимаю, что я должен переопределить поведение по умолчанию, поэтому я упомянул о реализации:). И я получаю значение переопределения его в некоторых компонентах, требующих представления строк внутри GUI. Однако, по крайней мере, в JDK я вижу множество реализаций, которые используются только тогда, когда вам нужно отлаживать экземпляры объектов.

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

-JP

Ответ 7

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

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

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

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

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

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

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

Ответ 8

Полезно для

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

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

Ответ 9

ToString() также вызывается .NET Framework неявно при печати любого объекта в строку.

Console.WriteLine("My Object is" + object.ToString());

эквивалентно

Console.WriteLine("My Object is" + object);

потому что ToString() неявно называется.

Я считаю, хотя я не уверен, что он используется отладчиком для "значения" объекта. Это может быть довольно удобно, хотя и ограничено. В большинстве случаев лучше создать собственный визуализатор отладчика.

Ответ 10

В AS3 мне пришлось преобразовать 2D-массив в 1D-массив. Самое быстрое (скорость работы) и самое простое (время кодирования):

var new1DArray:Array = the2DArray.toString().split(",");

Будь удивлен, но он действительно работает так же, как предполагалось и довольно быстро!

Ответ 12

Помимо того, что уже сказано выше, переопределение 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.

Ответ 13

это может быть не "намеренное" использование, но я использовал его для сериализации данных

storeToHardDrive(studentList.ToString());