단순히 Cloneable
을 implements
한다고 클래스를 클론할 수 있는게 아닙니다.
Object.clone()
을 오버라이딩 해주어야합니다.
Cloneable
인터페이스의 clone
메소드를 어떻게 구현해야 하는지는 정해진 바가 없지만, 일반적으로 진정한 의미의 복제 가능성을 보장할 수 있도록 구현합니다.
그렇지 않으면 JVM clone이 사용됩니다.
기본 JVM clone은 원본 객체에서 primitive타입 값을 복사하고, 원본 객체가 객체를 갖는 경우 객체 참조를 복사하는 clone 을 의미합니다.
즉 JVM clone이 사용될 경우, 복제된 인스턴스들과 원본 인스턴스가 멤버 객체를 참조 공유할 수 있습니다.
역자 참조: “기본으로 제공되는 clone은 shallow copy니까 deep copy로 오버라이딩해라”라는 의미로 보입니다.
다른 방법으론 Cloneable
을 사용하지 않고, copy 생성자를 제공하는 방법이 있습니다.
이 방법도 클래스를 복사하는데 사용할 수 있는 좋은 방법 중 하나입니다.
규칙을 어긴 코드
class Team implements Cloneable { // 규칙을 어긴 코드
private Person coach;
private List<Person> players;
public void addPlayer(Person p) {...}
public Person getCoach() {...}
}
규칙을 준수한 해결책
class Team implements Cloneable {
private Person coach;
private List<Person> players;
public void addPlayer(Person p) { ... }
public Person getCoach() { ... }
@Override
public Object clone() {
Team clone = (Team) super.clone();
//...
}
}
If you like SONARKUBE, don’t forget to give me a star.