Какой смысл передавать аргумент того же типа класса? - PullRequest
3 голосов
/ 12 февраля 2012

Я видел пример, который пытается объяснить наследование в Java.Класс Employee, который является базовым классом, имеет три переменных экземпляра и три конструктора.это выглядит следующим образом:

public class Employee{
    private String name;
    private int id;

    public Employee(){

        name = " No Name!";
        id = 00100;
    }

    public Employee(String n, int i){

        name = n;
        id = i;
    }

    public Employee (Employee originalObject){

        name = originalObject.name;
        id = originalObject.id;

    }

Мой вопрос: в чем смысл третьего конструктора?и как он принимает аргумент с тем же типом, Employee, класса, над которым мы все еще работаем?В программе уже есть пустой конструктор и еще один, который передает String для name и int для id, так почему же существует дополнительный, который делает не намного больше, чем два предыдущих конструктора?

Ответы [ 6 ]

5 голосов
/ 12 февраля 2012

Похоже, что третий конструктор предназначен для создания копии существующего Employee объекта.

Возможно, вы могли бы сделать то же самое с:

new Employee(orig.getName(), orig.getId());

но это предполагает, что для каждого свойства есть методы "get".Проще реализовать один такой конструктор, а затем вызвать:

new Employee(orig);

Тогда, если нужно изменить свойства Employee, вам нужно будет изменить конструктор копирования только в одном месте.

1 голос
/ 12 февраля 2012

Это для удобства и называется «Конструктор копирования», где экземпляр Employee создается путем копирования свойств уже существующего экземпляра Employee.

1 голос
/ 12 февраля 2012

Это называется конструктор копирования (статья для C ++, но конструктор копирования - общая концепция).

Также в этом вопросе обсуждается разница между мелкой и глубокой копией .

1 голос
/ 12 февраля 2012

Третий конструктор, как вы говорите, не нужен, но он предоставляется для удобства любых клиентов этого класса.

Более кратко написать

new Employee(employee)

, чемпередать все параметры по отдельности.

Может также оказаться, что обязательные поля являются частными полями и поэтому могут быть недоступны для кода, создающего новые Employee экземпляры.Ваш класс является хорошим примером, поскольку у него нет открытых методов getName() и getId() для публичного представления этих свойств.

Наконец, передача другого экземпляра класса проясняет читателю, что мы делаемновый класс, который является дубликатом или копией оригинала.Возможность выразить это намерение явно облегчает обслуживание.

1 голос
/ 12 февраля 2012

Это называется конструктор копирования , и смысл таких конструкторов в том, что вы теперь можете свободно модифицировать этот новый Employee объект, не затрагивая оригинал, или наоборот.

Вы правы, что new Employee(other) эквивалентно new Employee(other.getName(), other.getId()), но версия конструктора копирования намного короче и делает намерение намного понятнее - а для более сложных объектов, которые не раскрывают все свое состояние, копия конструктор имеет доступ к деталям, которых нет у другого конструктора. Кроме того, если вы добавляете поля в Employee, вам не нужно изменять все вызывающие объекты вашего конструктора, что делает ваш код значительно более удобным для сопровождения.

0 голосов
/ 12 февраля 2012

Это конструктор копирования - предпочтительная альтернатива clone(), когда нам нужно создать копию экземпляра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...