2012-04-11 2 views
3

저는 RawReader라는 클래스를 사용하여 일부 리소스의 바이트를 읽고 파싱 한 다음 파일을 출력 디렉터리에 씁니다.여러 가지 유형을 생성자에 허용하는 것과 관련된 모범 사례가 있습니까?

다른 유형을 소스 및 대상으로 생성자에 전달할 수 있도록하는 것이 좋습니다. 문자열, URL, 파일 또는의 InputStream

  • 대상 (파일 또는 URL의) : : 문자열 (디렉토리) 또는 I는 8 개의 다른 나를 잎 생성자를 오버로드 할 경우
  • 파일 소스

    • 버전. 예를 들어 chunkSize과 같은 세 번째 선택적 인수를 추가하려면 16 개의 생성자가 필요합니다.

      반면에 나는 (Object, Object)(Object, Object, int)을받는 두 개의 생성자를 가질 수 있습니다. 인수의 형태를 검출 할 수있어 정확하지 않은 경우는 IllegalArgumentExceptions가 Throw됩니다.

      이러한 상황은 일반적으로 Java에서 어떻게 처리됩니까?

    +0

    이것이 내가 종종 생성자가 악하다고 생각하는 이유입니다. 토끼가 번식하는 것입니다! – ControlAltDel

    답변

    3

    당신은 사용할 수있는 builder : .build() 변수가 설정되어 어느 빌더 및 양수인 소요 Foo의 생성자를 호출

    Foo foo = new FooBuilder().setFile(..).setChunkSize().build(); 
    

    . 뭐 그런 :

    공용 클래스 푸 {

    private Foo(FooBuilder builder) { 
        //get whatever you can find from the builder to fill the state of Foo 
    } 
    public static FooBuilder { 
        private String filename; 
        private File file; 
        private InputStream stream; 
        private int chunkSize; 
        // getters and setters 
        public Foo build() { 
         return new Foo(this); 
        } 
    } 
    

    } (Object, Object, int) 모든 아이디어의

    +0

    답변 해 주셔서 감사합니다. :) 그것을 읽은 후 나는 주변을 둘러 보았고 지나가는 것이 아니라 객체를 반환하는 것보다 빌더 안에 새로운 객체를 만드는 [wikipedia의 예제] (http://en.wikipedia.org/wiki/Builder_pattern#Java)를 발견했습니다. 그 자체를 생성자에게 보낸다. 다른 하나를 선호하는 이유가 있습니까? – Annan

    +0

    은 중요하지 않습니다. 선호하는 문제입니다. – Bozho

    0

    먼저 끔찍한, 그런 식으로 가지 마세요! 강력한 타이핑, IDE 지원 및 API 명확성이 느슨합니다. 당신의 장소에

    당신이 취할 수있는 가장 확실한/낮은 수준의 입력에 생성자를 제한하고 빌더/팩토리 메소드 제공 할 것이다 : 당신을 당신이 같은 서명 생성자를 찾을 경우

    RawReader reader = RawReaderBuilder. 
        withInput(inputStream). 
        withOutput(someFile). 
        withChunkSize(). 
        build(); 
    
    0

    을 다른 이름으로 공장 방법을 사용할 수 있습니다 : 그것은 다른 유형이 생성자에 소스 와 목적지로 전달 될 수 있도록하는 것이 합리적

    public class Foo { 
    
        public static Foo createForDir(String dir) { 
         // create a Foo as you like and return it 
        } 
    
        public static Foo createForUrl(String url) { 
         // create a Foo as you like and return it 
        } 
    } 
    
    0

    .

    까지. 그러나 호출자가 자신을 쉽게 제공 할 수있는 변환을 제공하는 것은별로 의미가 없습니다. 특히 8 명의 생성자가 생길 경우 더욱 그렇습니다. 따라서 :

    (a) StringFile은 모두 필요하지 않습니다. 하나를 결정하고 그것에 충실하십시오. File을 사용합니다. 그것은 이미 생성자의 수를 4로 나눕니다.

    (b) 사례가 있지만 실제로는 URLInputStream이 둘 다 필요하지 않습니다. 'URL'을 없애면 숫자가 2로 나뉩니다.

    관련 문제