방법 또한이 멤버를 복제,이 클래스를 복제알 수없는 유형의 컬렉션을 복제하는 방법은 무엇입니까?
C member;
에
Collection<V> member;
또는
에 저장, 나는 컬렉션이 가정?방법 또한이 멤버를 복제,이 클래스를 복제알 수없는 유형의 컬렉션을 복제하는 방법은 무엇입니까?
C member;
에
Collection<V> member;
또는
에 저장, 나는 컬렉션이 가정?이 멤버를 복제하면서이 클래스를 복제하는 방법은 무엇입니까?
clone
메서드를 재정의한다고 가정합니다. 그래서 당신은 새로운 인스턴스 얻기 위해 member
의 제공 RuntimeType이를 사용할 수 있습니다
public class MyObject<V, C extends Collection<V>> {
private C member = ...;
@Override
public MyObject clone(){
MyObject clone = new MyObject();
if(member != null){
try {
clone.member = member.getClass().newInstance();
clone.member.addAll(member);
} catch(InstantiationException | IllegalAccessException ignore){}
}
// clone other properties
return clone;
}
}
을하지만 C
는 기본 생성자가 있거나 @shmosel에서 언급 한 바와 같이, 컬렉션도 될 수 있다고 보장 할 수 없다 때문에 아주 더러운 변경할 수 없다. 예 : addAll()
호출이 실패합니다.
private final Supplier<C> factory;
public MyObject(Supplier<C> factory){
this.factory;
}
을 그리고 그것은 처음 인 경우에만 member
를 만듭니다
MyObject
의 인스턴스를 만들 때이
Supplier<C>
을 요구할 수 위의 더러운 방법을 극복하기 위해 익숙한.
factory.get()
을 호출합니다.
그런 식으로 개체를 복제 할 때 member
변수를 안전하게 만들 수 있습니다. 그러나 그때는 아마도 member
에서 clone.member
으로 값을 복사하는 접근법의 차단기 일 것입니다.
'C'는 제네릭 유형입니까? –
'복제품'이란 무엇입니까? 선언 유형을 복사 하시겠습니까? 컬렉션을 복사 하시겠습니까? 컬렉션을 딥 복사 하시겠습니까? – n247s
'Collection'은'clone()'을 지원하지 않습니다. 기본 타입이 지원하지 않기 때문에 운이 좋지 않을 것입니다. 미리 계획을 세우고 코드가 올바른 유형을 사용하여 작업을 완료하도록하는 것이 가장 좋습니다. 'collection.addAll()'은 콜렉션이 아니라 콜렉션을 복사 할 것이므로 충분히 좋을 것이다. 그리고 항상 반성이 있습니다. 행운을 빕니다. – markspace