Переопределение to string java

Как использовать метод toString() Java

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

Если мы не определили в классе метод toString() , то будет вызван метод toString() класса Object .

Метод toString() Java: синтаксис

public String toString() < return getClass().getName()+"@"+Integer.toHexString(hashCode()); >// программа Java для демонстрации // работы метода toString() class Best_Friend < String name; int age; String college; String course; String address; Best_Friend (String name, int age, String college, String course, String address) < this.name = name; this.age = age; this.college = college; this.course = course; this.address = address; >public static void main(String[] args) < Best_Friend b = new Best_Friend("Gulpreet Kaur", 21, "BIT MESRA", "M.TECH", "Kiriburu"); System.out.println(b); System.out.println(b.toString()); >>
Best_Friend@232204a1 Best_Friend@232204a1

Пояснение : В приведенной выше программе мы создаем объект класса Best_Friend и предоставляем всю информацию о друге. Но когда мы пытаемся вывести Object , мы отображаем данные из classname@HashCode_in_Hexadeciaml_form . Если нужна соответствующая информация об объекте Best_friend , тогда нужно переопределить метод toString Java класса Object в классе Best_Friend .

// программа Java для демонстрации // работы метода toString() class Best_Friend < String name; int age; String college; String course; String address; Best_Friend (String name, int age, String college, String course, String address) < this.name = name; this.age = age; this.college = college; this.course = course; this.address = address; >public String toString() < return name + " " + age + " " + college + " " + course + " " + address; >public static void main(String[] args) < Best_Friend b = new Best_Friend("Gulpreet Kaur", 21, "BIT MESRA", "M.TECH", "Kiriburu"); System.out.println(b); System.out.println(b.toString()); >>
Gulpreet Kaur 21 BIT MESRA M.TECH Kiriburu Gulpreet Kaur 21 BIT MESRA M.TECH Kiriburu

Примечание . Во всех классах контейнерах, коллекциях, классах String , StringBuffer , StringBuilder метод toString Java переопределяется для значимого представления String . Поэтому настоятельно рекомендуется также переопределить метод toString() и в нашем классе.

// программа Java для демонстрации // работы метода toString() import java.util.*; class Best_Friend < String name; int age; String college; String course; String address; Best_Friend (String name, int age, String college, String course, String address) < this.name = name; this.age = age; this.college = college; this.course = course; this.address = address; >public static void main(String[] args) < Best_Friend b = new Best_Friend("Gulpreet Kaur", 21, "BIT MESRA", "M.TECH", "Kiriburu"); System.out.println(b); String s = new String("Gulpreet Kaur"); System.out.println(s); Integer i = new Integer(21); System.out.println(i); ArrayList l = new ArrayList(); l.add("BIT"); l.add("M.TECH"); System.out.println(l); >>
Best_Friend@232204a1 Gulpreet Kaur 21 [BIT, M.TECH]

Пожалуйста, оставляйте свои комментарии, если найдете ошибку в примерах использования метода toString или захотите поделиться дополнительной информацией по теме статьи.

Читайте также:  What language is python based on

Источник

Переопределение метода 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() можно отображать информацию о сотрудниках в желаемом формате.

Пойдем еще дальше и посмотрим, что произошло бы, если бы мы не переопределили метод 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 (часть 1)

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

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

10 подсказок по переопределению метода toString() в Java — ToStringBuilder Netbeans Eclipse

Java toString метод

toString метод в Java используется для предоставления ясной и достаточной информации об объекте ( Object ) в удобном для человека виде. Правильное переопределение метода toString может помочь в ведении журнала работы и в отладке Java программы предоставляя ценную и важную информацию. Поскольку toString() определен в java.lang.Object класса и его реализация по умолчанию не предоставляет много информации, всегда лучшей практикой является переопределение данного метода в классе-потомке. Фактически, если вы создаете важный или общий класс типа Order , Trade или Employee , всегда переопределяйте equals, hashCode, compareTo и toString методы в Java. По умолчанию реализация toString создает вывод в виде package.class@hashCode , к примеру для нашего примера toString() , toString() метод класса Country напечатает test.Country@18e2b22 где 18e2b22 это хэш-код объекта в шестнадцатеричном виде, если вы вызовете hashCode метод то он вернет 260943370, что является десятеричным эквивалентом 18e2b22. Эта информация не особо полезна во время поиска какой-либо проблемы. Давайте посмотрим на пример из реальной жизни где вам нужно найти проблему в соединении с сетью, в том случае если вы хотите знать с каким именно хостом и портом пытается соединиться ваша система и если Socket или ServerSocket печатает только информацию toString по умолчанию, то будет невозможно представить реальную проблему, но с переопределенной реализацией toString они могут предоставить полезную информацию, такую как имя хоста и номер порта. В этой Java-консультации мы дадим несколько подсказок по переопределению метода toString с примерами кода.

Как переопределить метод toString в Java:

Печать форматированной даты(т.е. день/месяц/год) вместо «сырого» значения. Это очень полезная подсказка при переопределении Java-метода toString . Обычный toString() класса java.util.Date не выводит форматированную дату и включает много деталей, которые не всегда нужны. Если вы используете частичный DateFormat т.е. dd-MM-yy в вашем приложении, то вы определенно хотели бы видеть этот формат вместо данного по умолчанию. IDE обычно не генерирует форматированный вывод Date и это то, что вам нужно сделать самому, но это того стоит. Прочитайте Как распечатать Date в формате ddMMyy в Java где детально описано форматирование Date в Java. Вы так же можете использовать SimpleDataFormat класс или библиотеку Joda Date time для этого.

Документирование формата toString

Если ваш метод toString() не выводит данные в виде поле=значение, то хорошей идеей будет документирование формата вывода toString , особенно для важных объектов типа Работник или Студент. К примеру если метод toString() класса Работник(Employee) печатает «John-101-Sales-9846387321» то хорошей практикой будет указать формат как «имя-ID-отдел-контакт», но в то же время не давайте клиенту возможность получать информацию из метода toString() , вы должны всегда предоставлять соответствующие методы для получения данных, такие как getName() , getId() , getContact() и так далее, поскольку информация полученная из toString() представления объекта является хрупкой и подвержена ошибкам, так что клиент всегда должен иметь чистый путь получения информации.

Используйте StringBuilder для составления вывода toString()

Если вы пишете код для метода toString() в Java, тогда используйте StringBuilder что бы добавить отдельные атрибуты. Если вы используете IDE вроде Eclipse, Netbeans или IntelliJ тогда использование StringBuilder и метода append() вместо оператора + для составления toString , так же является верным путем. По умолчанию и Eclipse и Netbeans генерируют toString с оператором конкатенации.

Использование аннотации @Override

Использование @Override при переопределении метода в Java это одна из лучших практик в языке. Но эта подсказка не так важна, как это было бы в случае с переопределением методов equals() и compareTo() , поскольку перегрузка вместо переопределения может создать более тонкие, сложно вычисляемые, ошибки. В любом случае лучше использовать аннотацию @Overrride .

Печать содержимого массива, вместо вывода объекта массива

Массив это объект в Java но он не переопределяет метод toString и когда вы печатаете массив, то по умолчанию формат вывода не особо полезен, поскольку мы хотели бы видеть содержимое массива. К слову это еще одна причина почему char[] array предпочтительнее String для хранения чувствительных данных, таких как пароль. Найдите время взглянуть помогает ли печать содержимого массива вашим клиентам или нет и если это имеет смысл, то печатайте содержимое массива вместо самого объекта. Из соображений производительности предпочтительнее использовать Collection такие как ArrayList или HashSet вместо Array для хранения других объектов.

Бонусные подсказки

  1. Печатать вывод toString в несколько строк или в одну основываясь на его длине.
  2. Включать полные имена классов в представление toString , другими словами package.class что бы избежать любого непонимания.
  3. Вы можете пропускать значения null или показывать их, но лучше показывать. Иногда они полезны, поскольку показывают какое поле является null во время какого-то инциндента, к примеру NullPointerException.
  4. Используйте формат ключ-значение, к примеру member.name=member.value , большинство IDE поддерживают это.
  5. Включайте унаследованных членов, если вы считаете, что они должны предоставлять необходимую информацию в класс-наследник.
  6. Иногда объект содержит много необязательных и обязательных параметров, как мы показали в нашем примере шаблона Builder, когда практически невозможно распечатать все поля, в этом случае можно выводить только обязательные поля, тем более, что у нас есть необязательные.

Источник

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