- Как использовать метод toString() Java
- Метод toString() Java: синтаксис
- Переопределение метода Java toString () для вывода значений ArrayList
- Задача
- Вариант 1: Предоставление и реализация метода toString () в классе Employee
- Класс Employee
- Employee.java
- Основной класс — для хранения и извлечения записей сотрудников
- StoreAndRetrieveEmployeeRecords.java
- Результат
- Вариант 2: Возвращаемся к нашему основному вопросу
- Класс Employee
- Employee.java
- Основной класс — для хранения и извлечения записей сотрудников
- Результат
- Заключение
- Альтернативный способ
- 10 подсказок по переопределению метода toString() в Java (часть 1)
- Java toString метод
- Как переопределить метод toString в Java:
- Документирование формата toString
- Используйте StringBuilder для составления вывода toString()
- Использование аннотации @Override
- Печать содержимого массива, вместо вывода объекта массива
- Бонусные подсказки
Как использовать метод 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 или захотите поделиться дополнительной информацией по теме статьи.
Переопределение метода 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)
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 для хранения других объектов.
Бонусные подсказки
- Печатать вывод toString в несколько строк или в одну основываясь на его длине.
- Включать полные имена классов в представление toString , другими словами package.class что бы избежать любого непонимания.
- Вы можете пропускать значения null или показывать их, но лучше показывать. Иногда они полезны, поскольку показывают какое поле является null во время какого-то инциндента, к примеру NullPointerException.
- Используйте формат ключ-значение, к примеру member.name=member.value , большинство IDE поддерживают это.
- Включайте унаследованных членов, если вы считаете, что они должны предоставлять необходимую информацию в класс-наследник.
- Иногда объект содержит много необязательных и обязательных параметров, как мы показали в нашем примере шаблона Builder, когда практически невозможно распечатать все поля, в этом случае можно выводить только обязательные поля, тем более, что у нас есть необязательные.