Вопрос

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


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

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

Это было полезно?

Решение

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

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

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

Другие советы

Нет, суть в том, что вы должны переопределить реализацию по умолчанию 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() является допустимой операцией для что-либо.

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

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

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

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

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

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

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

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

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

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

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

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

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

-ДжП

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

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

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

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

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

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

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

Полезно для

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

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

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

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

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

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

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

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

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

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

Вы удивитесь, но на самом деле он работает так, как задумано, и довольно быстро!

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

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

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

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

storeToHardDrive(studentList.ToString());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top