Является ли toString() полезным только для отладки?
кроме того, конечно, их использование с примитивами. Большинство (если не все) реализаций, которые я вижу, полезны только с точки зрения программиста.
редактировать: Я понимаю, что я должен переопределить поведение по умолчанию, поэтому я упомянул реализации :). И я получаю значение переопределения его в некоторых компонентах, требующих строкового представления внутри GUI. Однако, по крайней мере, в JDK я вижу много реализаций, которые только приходите к использованию всякий раз, когда вам нужно отлаживать экземпляры объектов.
Почему он укоренен в классе Object, так как это кажется полезным только для GUI/отладки? есть ли другие применения, о которых я не знаю?
13 ответов
toString () полезен, когда вам нужно строковое представление объекта. Естественно, это происходит в целях отладки, но также может быть допустимо для вывода результатов операций пользователю.
например, предположим, у вас есть сложный класс, который обрабатывает комплексные числа. Если вы хотите распечатать их пользователю в формате 3 + 2И, это удобно, если они определяют toString (), поскольку вам не нужно писать формат каждый раз, и вывод будет последовательный. Если вы когда-нибудь захотите изменить это представление, например, на 3 + 2j, вам нужно только коснуться метода toString () в сложном классе.
таким образом, 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()
, ...)
Edit: что касается того, почему он укоренен в 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 я не вижу этого почти как много. На самом деле, я редко это вижу.
-JP
сначала toString
метод должен возвращать читаемое человеком текстовое представление объекта.
этот вопрос поднимается в Эффективная Java as пункт 10: всегда переопределять toString
.
он ссылается на спецификация API Java на Object.toString
способ:
результат должен быть кратким, но информативное представление, которое легко читать.
помимо отладки, переопределение toString
метод класса может быть полезен при ading объектов в JList
или JTable
, который по умолчанию будет использовать toString
метод отображения объекта в виде текстовой формы в списке или таблице.
например, в моем случае я переопределил toString
метод объектов, которые добавляются в JList
чтобы пользователь мог видеть информацию об элементе в список через GUI.
Итак, действительно есть случаи, когда toString
метод полезен для случаев, отличных от отладки. Ключ должен иметь toString
метод возвращает информацию, которая на самом деле полезна для человека, чтобы увидеть, а не по умолчанию Object.toString
реализация, где расположение памяти объекта используется для его текстового представления.
для
- Gui (сложное свойство при использовании PropertyGrid, текст заголовка формы)
- 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() также полезно при использовании элементов управления, которые его вызывают. Например, 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());