Переопределение метода Java toString () для вывода значений ArrayList
В этой статье мы разберемся с тем, почему нужно переопределение метода Java toString для отображения содержимого ArrayList.
Задача
Предположим, что мы хотим сохранить несколько записей Employee в Collection, предпочтительно через ArrayList для более быстрого доступа. Каждый раз, когда мы извлекаем записи, они должны выводиться в определенном формате. Есть два варианта реализации.
Вариант 1: Предоставление и реализация метода toString () в классе Employee
- Переопределите метод toString();
- Определите формат кода внутри метода toString().
Начнем с кода 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 для хранения записей сотрудников
ArrayList<Employee> empRecords = new ArrayList<Employee>();
// добавляем записи сотрудников в объект 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.
StoreAndRetrieveEmployeeRecords.java
package in.bench.resources.override.tostring;
import java.util.ArrayList;
public class StoreAndRetrieveEmployeeRecords {
public static void main(String[] args) {
// создаем объект ArrayList object для хранения записей сотрудников
ArrayList<Employee> empRecords = new ArrayList<Employee>();
// добавляем записи сотрудников в объект 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 и вызвать их соответственно для установки и извлечения значений.