Name already in use
JBook / object / toString.md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
3 contributors
Users who have contributed to this file
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
Как можно догадаться из названия, данный метод позволяет получить некоторое строковое представление объекта, на котором он вызывается.
У java.lang.Object этот метод определен как:
Т.е по-умолчанию результатом будет имя класса и его hashCode в hexadecimal представлении, разделенные символом @ . Именно поэтому в JavaDoc рекомендуется этот метод переопределять: никому не хочется вместо человекочитаемой информации видеть hash -код и имя класса!
Хорошо реализованный toString помогает и при отладке кода, так как в логе в таком случае печатаются легкочитаемые и информативные строки, показывающие что это за объект и что у него было за состояние на момент вызова.
Помните, что если вы переопределяете метод toString , то возвращаемая строка должна содержать всю значимую информацию объекта.
Пример переопределения toString
Для примера рассмотрим следующий класс и переопределим метод toString :
Создадим объект и распечатаем его в консоль:
Без переопределения toString у класса CarKey его объект снова выведет нечеловекочитаемую информацию, что должно навести на мысль: а так ли нужен вывод CarKey ? Если да, мы понимаем, что CarKey обязателен, это значимая информация для строкового представления класса Person , то необходимо либо переопределить toString у CarKey , либо вручную, например, с помощью get -методов, сформировать строковое представление объекта класса CarKey .
Еще один важный момент — это наличие и отсутствие get -методов для полей, которые входят в вывод toString . Если вы включаете какое-либо поле объекта в toString , то правильно было бы проконтролировать то, что у такого поля имеется get -метод. И действительно, если мы включаем поле в toString , который является публичным методом, то такое поле как минимум логично сделать доступным на чтение. Ведь его значение все равно попадает в результат toString .
Не имеет смысла убирать или не писать get -метод на поле name или age , если эти значения все равно будут показаны в результате вызова toString . Ни в коем случае не стоит включать в toString пароли и важные данные о пользователе или проводимой операции!
Вопрос:
Как вы думаете, определен ли и если определен, то как метод toString у классов-оберток в Java ? Например, java.lang.Integer ?
Ответ:
Метод toString у классов-оберток переопределен и всегда возвращает строковое представление значения примитива:
В конце повествования разберем еще вот такой пример:
У нас два класса, каждый из которых содержит ссылку на другой класс. Мы переопределяем toStirng так, как показано в коде выше.
Как вы думаете, что получится?
Как это произошло: System.out.println вызывает у объекта test1 метод toString , в методе toString у test1 происходит вызов toString у объекта test2 , внутри которого уже снова идет обращение к toString у test1 . В результате мы получаем зацикленность — мы ходим по кругу, вызывая toString , пока стек вызовов не переполнится.
Змей Уроборос снова укусил себя за хвост.
Дабы избежать таких ситуаций необходимо смотреть на то, что вы включаете в реализацию toStirng .
Старайтесь избегать написания кода, который завязан на результат работы toString . Метод не дает никаких гарантий о том, в каком формате и виде будет сформирована строка, строить свою логику вокруг этого не самая лучшая идея. Исключением из этого правила может быть разве что работа с примитивами и классами-обертками.
Если планируется использовать строковое представление класса, то необходимо переопределить метод toString .
Помните, что важно включать в такую реализацию только необходимую и достаточную информацию об объекте, убирая лишнее и не нужное. Плохим тоном считается создание огромных строковых представлений, в которых половина информации не имеет значения или является секретной, например, пароль пользователя. Если у поля нет get -метода, то, задайтесь вопросом: а так ли нужно включать такое поле в строковое представление объекта?
При включении в toString поля, принадлежащего к ссылочному типа, убедитесь, что у этого типа также переопределен toString , иначе вам придется вручную формировать строковое представление объекта. А лучше и вовсе задуматься о том, чтобы отказаться от включения его в toString реализацию класса.
Контролируйте то, что вы включаете в реализацию toString , помните о возможности циклического вызова, который неизбежно приведет к java.lang.StackOverflowError .
Старайтесь не строить свою логику и работу программы на результате вызова toStirng !
Помните, что большинство IDE сейчас легко сгенерируют вам toString , чтобы вы не писали его вручную.
Также, существуют сторонние проекты, которые берут кодогенерацию на себя, например, проект lombok.
Java: toString Method
![]()
Before we begin discussing the toString method, it is important to have a basic understanding of the class hierarchy in Java. All classes in Java inherit from the Object class; the Object class is at the root of the class hierarchy in Java.
Therefore, every existing built-in class or any class that is defined in Java has the Object as their parent (superclass) and has access to the methods in the Object class. If you are interested in learning more about the Object class, have a look at the official documentation. The toString method is one of the methods defined in the Object class and all classes inherently have this method.
Ideally, the toString method is to be used to return the textual representation of the object in string format. It is advisable to override this method in your classes to provide information about the object. For example, if you had a User class; your toString method would look something like this:
And in our main method, we create an object of the User class and if we pass that object as an argument directly into our print statement as such:
The output in the console is:
Voila! Our string method returned a textual representation of our object. If you are unfamiliar with the StringBuilder class, check out my article on it!
Now, you may wonder what happens if we don’t override the toString method in our User class; let’s find out! As you can see in Fig.3 below, I’ve removed the toString method from the User class.
When we call our main method again (see figure 2.1), the output in the console is the following:
This is the default toString method return value of the user1 object we created. This is because the toString method in the the Object class looks like this:
When we do not override the toString method, it defaults to using the toString method that is defined in the Object class and as a result we get the name of our class, followed by the ‘at sign’ and the hexadecimal representation of the hash code (integer value that is associated with each object in Java) of the object.
Переопределить метод toString в Java
Мы часто используем строки в Java, поскольку они являются неотъемлемой частью каждой программы. В этом руководстве мы увидим, как мы можем переопределить метод tostring() в Java, используя простой пример, чтобы лучше понять концепцию.
Заменить метод toString() с помощью аннотации @Override в Java
Метод toString() является частью класса Object , который является суперклассом каждого класса в Java. Это означает, что у каждого класса есть свой метод toString() . Но мы не всегда получаем желаемый результат от метода toString() по умолчанию. Это когда нам нужно переопределить метод и настроить его в соответствии с нашими потребностями.
Чтобы продемонстрировать, как переопределить метод toString() , мы рассмотрим два примера: один без переопределения метода toString() , а другой — с переопределением метода.
В приведенном ниже примере у нас есть класс ExampleClass с тремя переменными, которые инициализируются в конструкторе. Когда мы создаем объект класса ExampleClass с переданными аргументами и затем печатаем объект, мы получаем объект, который не имеет смысла и не читается людьми. Это потому, что при выводе exampleClass вызывается его значение по умолчанию toString() . Но мы хотим напечатать значения переменных в виде строки. Для этого в следующем примере мы переопределим метод toString() .
В следующем коде мы берем тот же пример, что и раньше, но на этот раз мы переопределяем метод toString() с помощью аннотации @Override и записываем имя метода как toString() с типом возврата String . Мы можем сделать это вручную или использовать ярлыки, включенные во многие IDE.
Поскольку метод возвращает строку, мы должны ее построить. Мы объединяем переменные со строкой, чтобы создать одну строку. Наконец, когда мы создаем объект exampleClass и печатаем его, мы получаем результат в виде String со значениями переданных переменных. Это происходит потому, что мы переопределяем метод toString() , чтобы указать нашу собственную реализацию.
Как переопределить метод toString() в Java
The toString() метод возвращает строковое представление объекта. Он широко используется для отладки, печати содержимого объектов в журналах и т. д. В этом посте мы обсудим, как переопределить toString() метод в Java.
Класс объектов уже содержит toString() метод, который возвращает строку, которая “текстуально представляет” объект. Реализация по умолчанию Object.toString() метод возвращает строку, состоящую из имени класса, ‘@’ символ, за которым следует беззнаковое шестнадцатеричное представление хеш-кода объекта. т.е.,
Поскольку все объекты Java наследуются от java.lang.Object , вам нужно переопределить toString() метод для получения желаемого строкового представления. В противном случае приведенная выше реализация по умолчанию toString() метод будет вызываться при попытке распечатать объект. Например,
Чтобы напечатать содержимое объекта, ваш класс должен переопределить toString() метод. Это можно сделать несколькими способами:
1. Использование оператора конкатенации строк
Вы можете использовать оператор конкатенации строк + четко и лаконично добавлять переменные-члены в класс. Хотя конкатенация строк с использованием + оператор не рекомендуется в Java, но может быть выполнен без цикла, поскольку компилятор Java неявно создает промежуточный StringBuilder объект.
результат:
Country
2. Использование 'StringJoiner'
В Java 8 и выше мы можем использовать StringJoiner class, который принимает разделитель и создает последовательность значений, разделенных разделителем.
результат:
Country[name='United States', continent='North America', population=331449281]
3. Использование Guava 'MoreObjects.ToStringHelper()'
Guava’s MoreObjects class предоставляет несколько вспомогательных функций, которые работают с любым объектом Java. Для реализации Object.toString() метод, вы можете создать экземпляр MoreObjects.ToStringHelper , и позвоните add(name, value) метод для каждого поля. add(name, value) Метод добавляет пару имя-значение к выходным данным в формате имя=значение.
Если вам просто нужно добавить безымянное значение к выводу, вызовите метод addValue(value) метод. Кроме того, вы можете игнорировать свойства с нулевыми значениями, используя omitNullValues() метод.
результат:
Country
4. Использование Apache Commons 'ToStringBuilder' class
Похож на Guava MoreObjects класс, библиотека Apache Commons Lang предоставляет ToStringBuilder класс для помощи в реализации Object.toString() методы. Чтобы использовать этот класс, напишите следующий код:
результат:
[email protected][name=United States,continent=North America,population=331449281]
Кроме того, вы можете напрямую вызвать reflectionToString() метод, который использует отражение для создания toString для указанного объекта. Обратите внимание, что этот метод может не работать под управлением менеджера безопасности, поскольку он использует AccessibleObject.setAccessible изменить видимость частных полей в классе.
результат:
[email protected][continent=North America,name=United States,population=331449281]
Обратите внимание, что почти все IDE (Eclipse, IntelliJ IDEA и т. д.) предлагают поддержку автоматического создания toString() метод, основанный на переменных-членах в классе. Рекомендуется использовать соответствующие функции IDE для создания toString() вместо того, чтобы писать его самостоятельно. Например, в IntelliJ IDEA вы можете просто щелкнуть правой кнопкой мыши исходный код, выбрать меню «Создать» и выбрать параметр toString. Либо просто нажмите Alt+Insert и выберите параметр toString.