2008-10-06 6 views
5

는 다음과 같은 방법 서명 고려 :개체 배열

public fooMethod (Foo[] foos) { /*...*/ } 

public fooMethod (Foo... foos) { /*...*/ } 

설명 : 전자 인수로 푸 - 객체의 배열을 - fooMethod(new Foo[]{..}) - 후자 동안 Foo 타입의 임의의 양의 인수를 취해 메소드 -내의 Foo : s 배열로 제공합니다.

Java가 정의되어 있으면 Java가 적합을 던져서 그것이 중복 메소드라고 주장합니다. 나는 몇 가지 형사 작업을 수행했으며 첫 번째 선언은 Foo 객체의 명시 적 배열을 필요로한다는 것을 알아 냈습니다. 그리고 그 방법을 호출하는 유일한 방법입니다. 두 번째 방법은 실제로 임의의 양의 Foo 인수를 받아 들일뿐만 아니라 Foo 객체의 배열을 받아들입니다.

그래서 질문은 후자의 방법이 더 유연 해 보이기 때문에 첫 번째 예제를 사용할만한 이유가 있습니까? 아니면 중요한 것을 놓친 것입니까?

+0

자바를 모르면 어둠 속에서 찌르는 듯하다. 그러나 나는 첫 번째가 약간 효율적이라고 가정 할 것이다. 왜냐하면 : a) 아마도 하나의 포인터 만 통과 할 것이고, b) 당신은있을 것이다. 하나의 포인터를 메모리의 연속 부분에 전달합니다. –

+0

@monoxide : 아니요, 두 형식 모두 해당하는 호출 바이트 코드를 생성합니다. 두 형식 모두 전달할 배열을 작성해야합니다. –

+0

두 번째 형식은 첫 번째 구문 구문 설탕입니다. fooMethod (new Foo (1), new Foo (2))는 fooMethod (new Foo (new foo (1), new foo (2))와 동일합니다. –

답변

12

이러한 방법은 실제로 동일합니다.

이 기능은 varargs라고하며 컴파일러 기능입니다. 뒤에는 이전 버전으로 변환됩니다.

Object ...를 수락하는 메서드를 정의하고 Object [] 형식의 매개 변수 하나를 보내면 함정이 있습니다!

+0

Java는 이것에 대해 경고하고, (Variadic 모드의 경우) (Object) 배열 또는 (Variadic 모드가 아닌 경우) (Object []) 배열을 쓰도록 요청합니다. :-) –

1

후자는 Java 5에서 소개되었으며 기존 라이브러리는이를 지원하기 위해 점차적으로 재 작업되고 있습니다. 당신은 여전히 ​​방법이 2+ 입력을 요구한다는 점을 강조하기 위해 전자를 사용할 수 있습니다. 또한 ...가 사용될 수있는 곳에 제한이 있습니다.

+0

실제로 0 또는 1 입력을 허용합니다 (문서에서 다르게 지정되지 않은 경우 가변적 인 형식이 그 렇지 만). –

0

성능 문제 또는 고려해야 할 사항이 없으므로 의미에 관한 것입니다.

메소드의 호출자가 Foo의 배열을 준비하고있을 것으로 기대합니까? 그런 다음 Foo [] 버전을 사용하십시오. varargs 변형을 사용하여 배열 대신 Foo의 "묶음"을 가질 가능성을 강조하십시오. 그래서 인수의 배열을 가지는

여기
string Format(string formatString, object... args) 

당신이 인수는 다른 유형이 될 것으로 기대 :

가변 인자에 대한 고전적인 예는 (C#으로 자바에서 호출하는 방법을 몰라) 문자열 포맷을 인도 표준시 꽤 변칙적 일 것입니다, 그러므로 varargs 변종입니다. 뭔가 다른 한편으로

배열을 사용하여
string Join(string[] substrings, char concatenationCharacter) 

처럼 완벽하게 합리적이다.

매개 변수 목록 끝에 여러 개의 배열 매개 변수와 하나의 vararg 매개 변수가있을 수 있습니다.

3

varargs 구문의 또 다른 제한 사항은 vararg가 마지막으로 선언 된 매개 변수 여야한다는 점을 Shimi의 설명에 추가하고 싶습니다. 그래서 당신은 이것을 할 수 없습니다 :

void myMethod(String... values, int num); 

즉, 어떤 주어진 메소드도 하나의 vararg 매개 변수만을 가질 수 있습니다.여러 배열을 전달하려는 경우, 그 중 하나만 varargs를 사용할 수 있습니다.

실제적으로 varargs는 args를 배열이 아닌 임의의 수의 고유 한 값으로 처리 할 때 최고입니다. Java5는이를 가장 편리한 것으로 생각하기 때문에 배열에 매핑합니다.

좋은 예가 String.format()입니다. 여기서 varargs는 첫 번째 인수의 형식 자리 표시 자와 일치합니다.