Переопределение метода 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»

Пожалуйста, оставляйте ваши комментарии по текущей теме статьи. Мы очень благодарим вас за ваши комментарии, подписки, отклики, дизлайки, лайки!