Как переопределить метод tostring java

Содержание
  1. Как переопределить метод toString() в Java
  2. 1. Использование оператора конкатенации строк
  3. 2. Использование ‘StringJoiner’
  4. 3. Использование Guava ‘MoreObjects.ToStringHelper()’
  5. 4. Использование Apache Commons ‘ToStringBuilder’ class
  6. Переопределение метода Java toString () для вывода значений ArrayList
  7. Задача
  8. Вариант 1: Предоставление и реализация метода toString () в классе Employee
  9. Класс Employee
  10. Employee.java
  11. Основной класс — для хранения и извлечения записей сотрудников
  12. StoreAndRetrieveEmployeeRecords.java
  13. Результат
  14. Вариант 2: Возвращаемся к нашему основному вопросу
  15. Класс Employee
  16. Employee.java
  17. Основной класс — для хранения и извлечения записей сотрудников
  18. Результат
  19. Заключение
  20. Альтернативный способ
  21. 10 подсказок по переопределению метода toString() в Java (часть 2)
  22. Метод toString созданный Netbeans IDE
  23. Метод toString() созданный IDE Rclise
  24. Использование ToStringBuilder для переопределения метода Java toString()
  25. Когда в Java вызывается метод toString
  26. Преимущества переопределения метода 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.

Читайте также:  Php escape json string

Кроме того, IntelliJ IDEA предлагает гибкость выбора между различными шаблонами toString, такими как StringBuilder, ToStringBuilder (Apache commons-lang 3), Objects.toStringHelper (Guava), MoreObjects.toStringHelper (Guava 18+), StringJoiner (JDK 1.8), String concat (+ ), так далее.

Это все о переопределении toString() метод в Java.

Средний рейтинг 5 /5. Подсчет голосов: 16

Голосов пока нет! Будьте первым, кто оценит этот пост.

Сожалеем, что этот пост не оказался для вас полезным!

Расскажите, как мы можем улучшить этот пост?

Источник

Переопределение метода Java toString () для вывода значений ArrayList

В этой статье мы разберемся с тем, почему нужно переопределение метода Java toString для отображения содержимого ArrayList .

Задача

Предположим, что мы хотим сохранить несколько записей Employee в Collection , предпочтительно через ArrayList для более быстрого доступа. Каждый раз, когда мы извлекаем записи, они должны выводиться в определенном формате. Есть два варианта реализации.

Вариант 1: Предоставление и реализация метода toString () в классе Employee

Начнем с кода toString Java для реализации вышеуказанного решения.

Класс Employee

  • Содержит четыре атрибута: id , name , age , designation ;
  • Конструктор с четырьмя аргументами;
  • Переопределяет метод toString () , предоставляющий формат для вывода информации о сотруднике.

Employee.java

package in.bench.resources.override.tostring; public class Employee < // внутренние переменные private int employeeId; private String employeeName; private int employeeAge; private String employeeDesignation; // Конструктор с четырьмя аргументами public Employee(int employeeId, String employeeName, int employeeAge, String employeeDesignation) < super(); this.employeeId = employeeId; this.employeeName = employeeName; this.employeeAge = employeeAge; this.employeeDesignation = employeeDesignation; >// переопределение метода toString() @Override public String toString() < return "Employee [employeeId=" + employeeId + ", employeeName=" + employeeName + ", employeeAge=" + employeeAge + ", employeeDesignation=" + employeeDesignation + "]"; >>

Основной класс — для хранения и извлечения записей сотрудников

  • Используется для хранения и извлечения записей сотрудников в toString ;
  • В ArrayList хранятся все записи сотрудников;
  • Для извлечения записей сотрудников используется улучшенный цикл forEach .

StoreAndRetrieveEmployeeRecords.java

package in.bench.resources.override.tostring; import java.util.ArrayList; public class StoreAndRetrieveEmployeeRecords < public static void main(String[] args) < // создаем объект ArrayList для хранения записей сотрудников ArrayListempRecords = new ArrayList(); // добавляем записи сотрудников в объект AL empRecords.add(new Employee(101, "SJ", 19, "Writer")); empRecords.add(new Employee(102, "RS", 17, "Developer")); empRecords.add(new Employee(103, "ZR", 25, "Supporter")); empRecords.add(new Employee(104, "IL", 27, "Manager")); empRecords.add(new Employee(105, "SR", 15, "Marketer")); // извлекаем записи сотрудников с помощью улучшенного цикла forEach for(Employee emp : empRecords) < System.out.println(emp); >> >

Результат

Employee [employeeId=101, employeeName=SJ, employeeAge=19, employeeDesignation=Writer] Employee [employeeId=102, employeeName=RS, employeeAge=17, employeeDesignation=Developer] Employee [employeeId=103, employeeName=ZR, employeeAge=25, employeeDesignation=Supporter] Employee [employeeId=104, employeeName=IL, employeeAge=27, employeeDesignation=Manager] Employee [employeeId=105, employeeName=SR, employeeAge=15, employeeDesignation=Marketer]

Вариант 2: Возвращаемся к нашему основному вопросу

Почему нужно переопределить метод toString() для отображения содержимого ArrayList ?

В приведенном выше примере :

  • Мы переопределили метод toString Java ;
  • Предоставили детали реализации для вывода информации о сотрудниках в определенном формате;
  • Благодаря переопределению метода toString() можно отображать информацию о сотрудниках в желаемом формате.
Читайте также:  Сериализация в java xml

Пойдем еще дальше и посмотрим, что произошло бы, если бы мы не переопределили метод toString () .

Класс Employee

  • Это тот же класс сотрудников, содержащий четыре атрибута: Id , name , age , designation ;
  • Конструктор с четырьмя аргументами;
  • Но в этом случае не переопределяется метод toString() . Это означает, что по умолчанию будет вызван метод toString() класса Object .

Employee.java

package in.bench.resources.override.tostring; public class Employee < // внутренние переменные private int employeeId; private String employeeName; private int employeeAge; private String employeeDesignation; // Конструктор с четырьмя аргументами public Employee(int employeeId, String employeeName, int employeeAge, String employeeDesignation) < super(); this.employeeId = employeeId; this.employeeName = employeeName; this.employeeAge = employeeAge; this.employeeDesignation = employeeDesignation; >>

Примечание : метод toString() не переопределяется.

Основной класс — для хранения и извлечения записей сотрудников

Это тот же самый класс, который используется в первом варианте toString Java .

package in.bench.resources.override.tostring; import java.util.ArrayList; public class StoreAndRetrieveEmployeeRecords < public static void main(String[] args) < // создаем объект ArrayList object для хранения записей сотрудников ArrayListempRecords = new ArrayList(); // добавляем записи сотрудников в объект AL empRecords.add(new Employee(101, "SJ", 19, "Writer")); empRecords.add(new Employee(102, "RS", 17, "Developer")); empRecords.add(new Employee(103, "ZR", 25, "Supporter")); empRecords.add(new Employee(104, "IL", 27, "Manager")); empRecords.add(new Employee(105, "SR", 15, "Marketer")); // извлекаем записи сотрудников с помощью улучшенного цикла forEach for(Employee emp : empRecords) < System.out.println(emp); >> >

Результат

in.bench.resources.override.tostring.Employee@1db9742 in.bench.resources.override.tostring.Employee@106d69c in.bench.resources.override.tostring.Employee@52e922 in.bench.resources.override.tostring.Employee@25154f in.bench.resources.override.tostring.Employee@10dea4e

Заключение

  • Консоль выводится без метода toString() ;
  • Представление информации о каждом сотруднике в шестнадцатеричном формате;
  • Qualified_class_name@HashCode_in_HEX_format ( то есть имя класса, за которым следует символ @ , а затем хэшкод для Object в шестнадцатеричном формате );
  • Поэтому важно переопределить метод toString () для вывода значений объекта ArrayList в желаемом формате.

Альтернативный способ

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

Источник

10 подсказок по переопределению метода toString() в Java (часть 2)

Java-университет

Мы будем использовать следующий класс, что бы продемонстрировать наш toString пример для Netbeans, Eclipse и Apache’s ToStringBuilder утилиты.

/** * Java программа, демонстрирующая как переопределить метод toString() в Java. * Эта Java программа показывает как вы можете использовать IDE типа Netbeans или Eclipse * и открытую библиотеку типа Apache commons ToStringBuilder для * переопределения toString в Java. * @author Javarevisited.blogspot.com */ public class Country < private String name; private String capital; private long population; private Date independenceDay; public Country(String name)< this.name = name; >public String getName() < return name; >public void setName(String name) public String getCapital() public void setCapital(String capital) public Date getIndependenceDay() public void setIndependenceDay(Date independenceDay) public long getPopulation() < return population; >public void setPopulation(long population) @Override public String toString() < return "Country'; > public void setIndependenceDay(String date) < DateFormat format = new SimpleDateFormat("dd/MM/yyyy"); try < this.independenceDay = format.parse(date); >catch (ParseException ex) < Logger.getLogger(Country.class.getName()).log(Level.SEVERE, null, ex); >> public static void main(String args[]) < Country India = new Country("India"); India.setCapital("New Delhi"); India.setIndependenceDay("15/07/1947"); India.setPopulation(1200000000); System.out.println(India); >>

Метод toString созданный Netbeans IDE

Метод toString созданный Netbeans IDE создает следующий вывод для определенного выше класс:

Если вы посмотрете на приведенный вывод, то увидите, что Netbeans не создает форматированную дату для вас: вместо этого он вызывает метод toString() класса java.util.Date

Читайте также:  Форма отправки запроса html

Метод toString() созданный IDE Rclise

По умолчанию Eclipse создает следующий метод toString:

@Override public String toString()

Вы можете создать код для метода toString в Eclipse нажав на Source —> Generate toString(). Это так же предоставляет несколько возможностей, таких как выбор стиля кода, то есть использование операнда конкатенации или StringBuilder и так далее. Ниже вывод метода toString() который мы только что создали в Eclipse:

Country [name=India, capital=New Delhi, population=1200000000, independenceDay=Tue Jul 15 00:00:00 VET 1947]

Использование ToStringBuilder для переопределения метода Java toString()

Вместе со многими полезными классами, такими как PropertyUtils, EqualsBuilder или HashCodeBuilder Apache так же предоставляет ToStringBuilder который может генерировать код для вывода метода toString() несколькими разными стилями. Давайте посмотрим как выглядит вывод метода toString в простом и много-строчном стиле: Простой стиль:

India,New Delhi,1200000000,Fri Aug 15 00:00:00 VET 1947

test.Country@f0eed6[ name=India capital=New Delhi population=1200000000 independenceDay=Fri Aug 15 00:00:00 VET 1947 ]

NO_FIELD_NAMES_STYLE (стиль без имен полей)

test.Country@1d05c81[India,New Delhi,1200000000,Fri Aug 15 00:00:00 VET 1947]

SHORT_PREFIX_STYLE (стиль с коротким префиксом)

Country[name=India,capital=New Delhi,population=1200000000,independenceDay=Fri Aug 15 00:00:00 VET 1947]

ToStringStyle.DEFAULT_STYLE (стиль по умолчанию)

test.Country@1d05c81[name=India,capital=New Delhi,population=1200000000,independenceDay=Fri Aug 15 00:00:00 VET 1947]

Похожая открытая библиотека от Google — Guava так же предоставляет удобный API для создания кода метода toString в Java.

Когда в Java вызывается метод toString

toString довольно специфичный метод и вызывается из множества JavaAPI методов таких как println(), printf(), журналирование, assert statement, отладчики в IDE, при распечатке коллекций и при конкатенации. Если подкласс не переопределяет toString(), тогда вызывается реализация по умолчанию определенная в классе Object. Многие разработчики используют API для журналирования типа Log4J или java.util.Logger для вывода журналов и часто пропускают здесь Object.

logger.info(«Customer not found:» + customer)

и если Customer не переопределяет toString и не выводит важной информации, такой как customerId, customerName и т.д. то довольно трудно будет диагностировать проблему. Это то, почему всегда стоит переопределять toString в Java. Давайте взглянем на некоторые преимущества в случае, если мы будем это делать.

Преимущества переопределения метода toString

  1. Как говорилось выше, правильно переопределенный toString помогает в отладке путем вывода важной информации.
  2. Если важный объект сохранен в коллекции, тогда печать коллекции вызовет toString метод сохраненного объекта, который сможет распечатать важную информацию. Один из классических примеров не переопределенного метода toString это Array в Java, который печатает результат реализации по умолчанию, вместо содержимого массива. Хотя есть несколько способов распечатать содержимое массива с помощью Arrays.toString() и т.п; но поскольку Array является объектом Java, было бы намного лучше, если бы он знал как распечатать себя, так же, как классы коллекций, вроде List или Set.

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

Источник

Оцените статью