Зачем нам нужен этот специальный тип конструктора?

1
public MyConstructor(MyConstructor mc){
   this.setId(mc.getId());
   this.setName(mc.getName());
}

Вот почему нам нужно установить значение в конструкторе, получив его метод getter. Есть ли какая-то особая цель?

  • 1
    Привет, единственная причина в том, что аксессор (getter / setter) имеет некоторую логику.
  • 1
    вы не используете геттеры из объекта, который вы создаете ( this ), а тот из объекта, который вы копируете ( mc )
Показать ещё 6 комментариев
Теги:
constructor
domain-object

4 ответа

1
Лучший ответ

Как уже указывалось в других ответах, этот конструктор в основном предназначен для клонирования объектов и иногда упоминается как конструктор копирования

Как предлагает Джошуа Блох в своей книге "Эффективная Ява", пункт 11, такой конструктор обычно должен быть предпочтительнее реализации метода clone(), поскольку метод clone() имеет некоторые проблемы (подробности см. В книге или соответствующих вопросах stackoverflow),

Нет никаких наводящих причин для его реализации именно так, и в этом случае он действительно не нужен. Как упоминалось в комментариях, можно (скорее всего) записать его как

public MyConstructor(MyConstructor mc){
    this.id = mc.getId();
    this.name = mc.getName();
}

или

public MyConstructor(MyConstructor mc){
    this.setId(mc.id);
    this.setName(mc.name);
}

или

public MyConstructor(MyConstructor mc){
    this.id = mc.id;
    this.name = mc.name;
}

Здесь автор решил использовать подход вложенного set(mc.get()). Он имеет потенциальное преимущество в том, что он исключительно полагается на интерфейс, который определяется с точки зрения методов get/set и, следовательно, может быть более устойчивым к изменениям.

Можно спорить о том, является ли это хорошей практикой в целом, но я думаю, что для конструктора копий он красиво и четко заявляет: "Этот объект инициализируется здесь, исключительно на основе (и точно так же) данного объекта".


Сторона примечания: клонирование объекта и предоставление клонам того же идентификатора, скорее всего, побеждает пурпуру идентификатора - но могут быть случаи, когда это подходит

0

Это важно учитывать, особенно если ваш класс будет выведен классом (sub).

public class Child extends Parent {

    private int id;
    private String name = "Child";

    ...
    // getter and setters...
}


public class Parent {

    private int id;
    private String name = "Parent";

    public Parent(Parent parent) {
        this.setId(parent.getId());
        // option#1
        this.setName(parent.getName());
        // option#2
        // this.name = parent.name;
    }
    ...
    // getter and setters...
}

Пример основной:

public class Main {
    public static void main(String ...strings ) {

        Parent parent = new Parent();
        Child child = new Child();

        Parent parent2 = new Parent(child);
        System.out.println(parent2.getName());

    }
}

Вывод:

Child

Но если мы используем опцию №2 this.name = parent.name вместо этого вывод будет

Parent
0

Рассмотрим клонирование объектов на мгновение, но это не клонирование. Если вы сталкиваетесь с ситуацией, когда у вас есть объект MyConstructor (type) в вашей руке, и вам нужно создать еще один новый объект с тем же типом объекта MyConstructor. Итак, в вашем классе MyConstructor вам нужен такой конструктор, как указано выше.

Там вы берете объект, что у вас в руке, и принимаете идентификатор этого объекта, когда вы создаете свой новый второй объект

0

Цель такого конструктора, в основном, заключается в клонировании. Предположим, вам нужно назначить значение одного объекта другому, а не ссылку, это будет работать нормально.

Здесь уже обсуждается: Как скопировать объект в Java?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню