Переопределение метода 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 и вызвать их соответственно для установки и извлечения значений.

Вадим Дворниковавтор-переводчик статьи «Overriding toString() method to print values of ArrayList in Java»