2010-03-03 6 views
2

일부 Java 프로그래밍 경쟁에서 작업을 발견했습니다. 'text'라는 단 하나의 인수와 하나의 생성자 만 사용하여 Sentence 클래스를 만들어야합니다. 다음은 샘플 테스트 코드입니다.한 생성자 - 여러 인수

Sentence s1=new Sentence("only","CAT"), 
     s2=new Sentence("and", 2, "mice"), 
     s3=new Sentence(s1,s2,"completely","alone"), 
     s4=new Sentence(s3, "on the ", new Integer(32), "th street"); 

System.out.println(s1); Only cat. 
System.out.println(s2); Only cat and 2 mice. 
System.out.println(s3); Only cat and 2 mice completely alone. 
System.out.println(s4); Only cat and 2 mice completely alone on the 32th street. 

하나의 컨스트럭터가 서로 다른 인수 세트를 제공 할 수있는 방법은 무엇입니까? 전송 된 값을 인식하는 동적 생성자와 같은 것이 있습니까?

답변

7

varargs을 사용하십시오.

public class Sentence { 

    public Sentence(Object... text) { 
     // ... 
    } 

} 

직접 생성자 논리를 채 웁니다. 그러나 모든 유형을 결정하는 것은 약간 끔찍한 일이 될 수 있습니다. Object#toString()을 사용하고 Sentence 클래스도 구현할 수 있습니다.

+0

유형이 테스트 코드 내에서만 지원되는 것 같습니다. Dunno,이 경쟁에서 경쟁하지 않았다 :) – owca

2

예, varargs를 지원 5+ 자바 -이 같은, 같은 종류의 의해 복수의 인수를 전달할 수 있습니다 :

public Constructor(Object... args){..} 
public void methodName(Object... args){..} 

그런 다음 인수 Object의 배열로 액세스 할 수 있습니다. 하지만 항상 좋은 습관은 아닙니다. Varargs는 동일한 논리적 유형의 인수에만 사용해야합니다. 예를 들어, 이름 목록. 여러 인수를 전달해야한다면 생성자를 오버로드하는 것이 좋습니다.

이 경우 인수는 모두 동일한 논리적 유형 - "단어"이므로이 방법을 사용하는 것이 좋습니다.

+0

음 ... 다양한 printf 메소드는 다양한 인수 유형을 사용하여 varargs를 사용한다. 나는 "좋은 연습"발언에 동의하지 않는다. –

1

Object ... 값을 수락하면 아무 것도 toString을 사용하여 문자열로 변환 할 수 있습니다. toString는 Object에서 정의되므로 모든 Object가이를 지원해야합니다.

+0

비록 모든 객체가이 문장 객체에 실질적으로 유용한 구현을 제공하지는 않습니다. –

+0

@ Monkey : 그렇습니다. 그렇다면 어떻게할까요? 이것이 실제 프로그램이라면, 의미있는 결과를주는 값으로 만 호출하는 것은 프로그래머의 책임이라고 생각합니다. 대안은 Sentence 클래스가 받아 들일 수있는 클래스의 하드 코딩 된 목록을 가지게되는 것이고 이는 설계 결정을 크게 제한 할 것입니다. – Jay

+0

추가 생각 : 물론 toSentenceString 함수 또는 그와 비슷한 것을 가진 인터페이스를 만든 다음 Interface 유형의 입력 만 받아 들일 수 있습니다. 그러면 목록을 미리 결정할 필요없이 전달되는 것을 제어 할 수 있습니다. 그렇다면 인터페이스를 구현 한 무언가에 그것을 포장하지 않고 String이나 Integer를 전달할 수 없습니다. 그것이 나보다 더 큰 어려움이 될 것 같은 나에게 소리. – Jay