2009-02-19 3 views
10

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


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

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

+1

Ориентация на вопрос на несколько языков обязан получить различные результаты, основанные на принятую практике этого языка. – Robin

ответ

12

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

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

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

+0

Действительно, но нет никакой гарантии того, что '' согласованное строковое представление 'на всех. –

+0

У меня есть класс FooFile с FooFileSections. Чтобы записать файл, я просто переопределяю ToString для самого файла: FooFile.ToString(), а также для каждого раздела файла: FooFileSections.ToString(). затем я создаю содержимое файла, вызывая ToString в правой последовательности для FooFileSections, а затем просто выгружайте текст. Вероятно, это не очень хороший способ, но быстрый и легкий. –

+0

«выводит результаты операций пользователю». Поскольку текст 'toString()' не интернационализирован, сомнительно, насколько полезен текст в целом для пользователя. – Raedwald

17

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

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

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

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

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

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

+0

Очень полное наблюдение. Я просто думаю, что материал для маркировки GUI для toString() чрезмерно используется. Почему не что-то вроде «реализует интерфейс TextualRepresentation» или что-то в этом роде? –

+0

Я согласен, что это действительная операция для чего угодно, но только с точки зрения программиста. Я хочу сказать, что нет никакого контракта для указания того, что метод должен предоставлять строки, совместимые с GUI, или выставлять конкретные внутренние элементы экземпляра (поля), которые полезны только для программистов, IMHO –

+3

Часто плохо для целей пользовательского интерфейса, поскольку он не принимает пользовательский язык. Не имеет значения для отладки, имеет значение для конечных пользователей. – MSalters

0

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

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

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

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

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

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

+0

Отладчик может вызывать ToString() для некоторых объектов, но не для всех, как показано в списке , где вывод отладчика гораздо полезнее, чем вывод ToString(). – jwg

0

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

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

удивитесь, но это на самом деле работает, как предполагалось, и довольно быстро, слишком!

1

Полезно для

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

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

-1

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

storeToHardDrive(studentList.ToString()); 
13

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

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

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

+0

Учитывая, что The String является наиболее полезной конструкцией в программировании, может быть чрезвычайно полезно знать, что каждый объект в вашем программном пространстве удовлетворяет контракту, чтобы предоставить представление строки непосредственно. Как с чем-либо могущественным, его можно злоупотреблять, но это отходы, чтобы избежать этого. –

+1

Но, учитывая, что контракт a) ничего не гарантирует формат строки и b) не дает симметричного api для преобразования из String обратно в объект, я нахожу, что это слабый контракт. Я отлаживал много проблем, связанных с предположением о несуществующем «контракте» для toString. –

+0

У меня точно такой же взгляд. Я думаю, что текст GUI-текстового представления просто переработан методом. –

0

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

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

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

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

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

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

+2

Все, что я могу сказать, что за пределами отладки, это очень и очень непроницаемая абстракция :) –

2

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

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

Он ссылается на Java API Specification для метода Object.toString:

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

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

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

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

4

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

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

3

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

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

-JP

Смежные вопросы