2017-12-28 60 views
-1

방법 또한이 멤버를 복제,이 클래스를 복제알 수없는 유형의 컬렉션을 복제하는 방법은 무엇입니까?

C member; 

Collection<V> member; 

또는

에 저장, 나는 컬렉션이 가정?

+0

'C'는 제네릭 유형입니까? –

+0

'복제품'이란 무엇입니까? 선언 유형을 복사 하시겠습니까? 컬렉션을 복사 하시겠습니까? 컬렉션을 딥 복사 하시겠습니까? – n247s

+1

'Collection'은'clone()'을 지원하지 않습니다. 기본 타입이 지원하지 않기 때문에 운이 좋지 않을 것입니다. 미리 계획을 세우고 코드가 올바른 유형을 사용하여 작업을 완료하도록하는 것이 가장 좋습니다. 'collection.addAll()'은 콜렉션이 아니라 콜렉션을 복사 할 것이므로 충분히 좋을 것이다. 그리고 항상 반성이 있습니다. 행운을 빕니다. – markspace

답변

0

이 멤버를 복제하면서이 클래스를 복제하는 방법은 무엇입니까?

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으로 값을 복사하는 접근법의 차단기 일 것입니다.

+0

또는 변경 될 수 있습니다. – shmosel

+0

@shmosel 정확히 답변에 넣을거야. – Lino