public MyConstructor(MyConstructor mc){
this.setId(mc.getId());
this.setName(mc.getName());
}
Вот почему нам нужно установить значение в конструкторе, получив его метод getter. Есть ли какая-то особая цель?
Как уже указывалось в других ответах, этот конструктор в основном предназначен для клонирования объектов и иногда упоминается как конструктор копирования
Как предлагает Джошуа Блох в своей книге "Эффективная Ява", пункт 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
и, следовательно, может быть более устойчивым к изменениям.
Можно спорить о том, является ли это хорошей практикой в целом, но я думаю, что для конструктора копий он красиво и четко заявляет: "Этот объект инициализируется здесь, исключительно на основе (и точно так же) данного объекта".
Сторона примечания: клонирование объекта и предоставление клонам того же идентификатора, скорее всего, побеждает пурпуру идентификатора - но могут быть случаи, когда это подходит
Это важно учитывать, особенно если ваш класс будет выведен классом (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
Рассмотрим клонирование объектов на мгновение, но это не клонирование. Если вы сталкиваетесь с ситуацией, когда у вас есть объект MyConstructor
(type) в вашей руке, и вам нужно создать еще один новый объект с тем же типом объекта MyConstructor
. Итак, в вашем классе MyConstructor
вам нужен такой конструктор, как указано выше.
Там вы берете объект, что у вас в руке, и принимаете идентификатор этого объекта, когда вы создаете свой новый второй объект
Цель такого конструктора, в основном, заключается в клонировании. Предположим, вам нужно назначить значение одного объекта другому, а не ссылку, это будет работать нормально.
Здесь уже обсуждается: Как скопировать объект в Java?
this
), а тот из объекта, который вы копируете (mc
)