2015-06-05 2 views
-12

Сегодня один из тех дней, когда вы начинаете задаваться вопросом о том, что вы не знаете (или еще не сломаете) при кодировании, в этом случае это поворот метода toString в java, как правило (и, как описано в ответ here) по умолчанию toString представление многих объектов - это имя класса a, затем символ @, за которым следует шестнадцатеричное строковое представление hashcode такого экземпляра, мой вопрос: Могу ли я на самом деле что-то сделать с таким строковым представлением?Является ли метод DEFAULT toString в java действительно полезным?

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

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

На данный момент единственное, что я могу представить, это напечатать строку из двух экземпляров и проверить, что это разные экземпляры, но ... c'mon, как разработчик, вы можете сделать это разумнее!

P.S. Мне не нужны ответы с мнениями «Я думаю, что это реализовано таким образом, потому что ...», я хочу, чтобы кто-то рассказал мне, как я могу сделать такую ​​реализацию этого метода полезной для чего-то (или, по крайней мере, кого-то рассказывающие мне «нет, что реализация сек ## кс»)

UPDATE

1) Я не обсуждаю полезность метода

2) Я не обсуждаю, должен ли он быть переопределен или нет (он должен!)

3) Я не обсуждаю, будет ли другая реализация будет тяжелее обрабатывать

4) Я не обсуждаю, нужна ли реализация по умолчанию или нет (это!)

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

БЕЗ ПРЕВРАЩЕНИЯ ЭТОГО Могу ли я сделать что-то более полезное, чем сравнение того, что два экземпляра одинаковы?

+3

Это ** представление ** по умолчанию **. Это позволяет дифференцировать объекты, как в: если они одинаковые, это показывает. Если вам нужен что-то лучше для вашего класса, вы должны переопределить его. –

+0

Реализация по умолчанию в основном полезна для исключений и мониторинга. Вариант использования - это, например, идентификация экземпляра класса. – JacksOnF1re

+0

при отладке некоторых IDE отображает представление объектов в вашем списке просмотра toString. Если вы подготовили краткое представление, вы можете увидеть, что мы получили в объектах, не извлекая дерево. – hsnkhrmn

ответ

0

Почему нет? Иногда это очень полезно при отладке кода.Если переопределить MyObjecttoString() метод класса, то вы можете легко увидеть его статус как этот

System.out.println(myObj); 
+0

Да, это полезно, что я говорю о том, что «является ли реализация DEFAULT каким-то образом полезной? Я не говорю, что метод бесполезен, является ли реализация по умолчанию той, которая для меня бесполезна – Ordiel

5

реализация по умолчанию используется для:

  • Обеспечить реализацию, которая возвращает строку, так что любой код можно ожидать toString для возврата непустой строки. Это предотвращает отладку кода для исключения исключений, таких как метод, не реализованный или исключение нулевого указателя.
  • Реализация по умолчанию возвращает достаточно уникальную строку, чтобы иметь уверенность в том, что если 2 ссылки дают одну и ту же строку toString, они являются одним и тем же экземпляром.
+0

Согласен, я уже говорил, что , но такое поведение - это то, чего вы можете достичь без метода toString, вы можете сравнить их по памяти с помощью '==' сравнения их хэш-кодов, вопрос в том, как я могу как разработчик извлечь из этого выгоду? не согласен с тем, что полезно иметь стандартную реализацию, очевидно, необходимо, что я не понимаю, «как эта реализация по умолчанию эффективна?», если вы собираетесь сравнить, что 2 объекта являются одним и тем же экземпляром или не используют метод 'toString' похож на использование блендера, чтобы убить муху, он будет работать, но ... – Ordiel

+0

Если у вас есть список, вывод toString предоставит вам способ« вручную »увидеть, если он дублируется или если список буксировки ha общие элементы. Это полезно только для отладки, toString не следует вызывать побочную отладку, предназначенную только для классов, у которых есть полный класс toString. – Kazaag

+0

точно, как 'MyClass @ 45FDC17' полезен для отладки, за исключением тех случаев, когда вы проверяете, что два экземпляра одинаковы, не лучше ли иметь более описательную реализацию, так как это будут значения атрибуты этого класса как поведение по умолчанию? – Ordiel

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