2011-03-25 3 views
7

varargs를 사용하는 Java 함수 (또는 생성자)가 실제로 varargs 또는 배열과 함께 호출되었는지 여부를 확인하는 방법이 있습니까? Java : 함수가 varargs 또는 배열로 호출되었는지 알아보기

내가 다음이 말 :

public class MyCompositeObjects { 

    MyObject[] objects; 

    MyCompositeObjects(MyObjects... objects) { 
     this.objects = Arrays.copyOf(objects,objects.length); 
     // or just: this.objects = objects; ? 
    } 

    // ... 
} 

생성자는 나중에 변경 될 수 있습니다 하나의 MyObject[] 인수로 호출 될 수 있으며, 내가 생성자에서 배열을 복사하지 않는 경우 해당 변경 사항이 적용됩니다 멤버 변수 objects도 마찬가지입니다. 그러나 생성자가 여러 개의 MyObject을 사용하여 호출 된 경우 나중에 클래스 외부에서 변경하도록 배열 *에 대한 참조가 없으므로 직접 할당 할 수 있습니다. 생성자 내부에서 (또는 일반적으로 varargs를 사용하는 함수) 어떻게 호출되었는지 알 수 있습니까?

* nb : 구체적인 이름이 있습니까? 단순히 익명의 배열입니까?

답변

9

아니요, 불가능합니다. 완전히 투명하게 의미하는 것 -이 코드 :

new MyCompositeObjects(a, b); 

new MyCompositeObjects(new MyObjects[] { a, b }); 

당신이 신뢰 발신자 옳은 일을 할 수 있다면, 당신은 항상 두 개의 정적 메서드를 만들 수와 정확히 동일합니다을

public static MyCompositeObjects createWithCopy(MyObjects[] values) { 
    return new MyCompositeObjects(Arrays.copyOf(values, values.length)); 
} 

public static MyCompositeObjects createWithoutCopy(MyObjects... values) { 
    return new MyCompositeObjects(values); 
} 

private MyCompositeObjects(MyObjects[] values) { 
    this.objects = values; 
} 

참고 "복사본"버전을 사용하는 사용자에게 도움이되어야하는, 가변 인자를 사용하지 않는 방법 : 생성자 개인을 올바른 버전.

4

유일한 방법은 코드를 구문 분석하는 것입니다. 이것은 varargs가 컴파일 타임 기능을 기본으로하고 프로그램 실행 방법을 변경하지 않기 때문입니다.

의심 스럽다면 항상 배열을 복사합니다. 아시 않는 한 성능 문제가됩니다.

진술 : 다음을 수행 할 수 있습니다.

MyCompositeObjects(MyObjects o1, MyObjects... objects) { 

MyCompositeObjects(MyObjects[] objects) { 

그러나 이것은 원하는 것과 반대입니다.

다른 옵션은 정적 팩터 리를 사용하는 것입니다.

private MyCompositeObjects(MyObjects[] objects) { 
    this.objects = objects; 
} 

MyCompositeObjects create(MyObjects... objects) { 
    return new MyCompositeObjects(objects.close()); 
} 

MyCompositeObjects createNotCopied(MyObjects... objects) { 
    return new MyCompositeObjects(objects, false); 
} 

덜 안전한 버전의 경우 더 복잡한 방법 이름을 사용하십시오. 즉, 많은 생각을하지 않고 방법을 선택하면 안전 버전이 더 많이 사용됩니다.

+0

정적 공장 예에는 문제가 있습니다. "copy"부울은 생성자 인수가 아니며 objects.close()를 호출합니다. –

관련 문제