2014-12-24 1 views
3

최근에 내 MorseString 클래스로이 문제가 발생했습니다. 나는 다른 일을 두 가지 다른 생성자를 가지고 있지만 동일한 데이터 유형 걸릴 :이 솔루션을 함께했다다른 일을하지만 동일한 데이터 형식을 사용하는 두 생성자

/* 
* Constructor that takes the Morse Code as a String as a parameter 
*/ 

public MorseString(String s) { 
    if(!isValidMorse(s)) { 
     throw new IllegalArgumentException("s is not a valid Morse Code"); 
    } 
    // ... 
} 

/* 
* Constructor that takes the String as a parameter and converts it to Morse Code 
*/ 

public MorseString(String s) { 
    // ... 
} 

:

public MorseString(String s, ParameterType type) { 
    if(type == ParameterType.CODE) { 
     if(!isValidMorse(s)) { 
      throw new IllegalArgumentException("s is not a valid Morse Code"); 
     } 
     // Constructor that takes Morse 
    } else { 
     // Constructor that takes String 
    } 
} 

을하지만 추한 모습 . 다른 솔루션?

+0

생성자 대신 함수를 사용하십시오. –

+3

확실히 못 생겼지 만 같은 서명을 가진 두 개의 메소드/생성자를 가질 수 없습니다. – Gumbo

+1

이 질문은 코드 검토에 관한 것이므로 주제의 주제가 아닌 것으로 보입니다. [codereview] (codereview.stackexchange.com)에 더 적합 할 것입니다. –

답변

4

생성자 중 하나가 미리 만들어진 모스 코드 데이터를 기대하기 때문에 (즉, 데이터에서 개체를 생성하는 것처럼) "생성자"와 유사하며 다른 하나는 변환을 수행해야하므로 더 많은 작업을 수행 할 수 있습니다 감각 convert처럼 뭔가라는 정적 팩토리 메소드로 만들려면 : 유효한 모스 코드 문자열이 있다면

/* 
* Constructor that takes the Morse Code as a String as a parameter 
*/ 

public MorseString(String s) { 
    if(!isValidMorse(s)) { 
     throw new IllegalArgumentException("s is not a valid Morse Code"); 
    } 
    // ... 
} 

/* 
* Factory method that takes the String as a parameter and converts it to Morse Code 
*/ 

public static MorseString convert(String s) { 
    // ... 
    return new MorseString(convertedString); 
} 

그래서, 당신은 객체로 돌려 생성자를 사용합니다. 그러나 전환이 필요한 데이터가있는 경우 static factory 메소드를 호출하십시오.

MorseString ms = MorseString.convert(myString); 
9

예.

class MorseString { 
    private MorseString(){}; 
    public static MorseString getFromCode(String s) { 
     // ... 
    } 
    public static MorseString getFromString(String s) { 
     // ... 
    } 
} 

// Usage: MorseString.getFromCode(foo); 

또는

2) Builder 그래서 :이 같은 방법이있을 것이다, 그래서 같은

1) Factory Method로, 당신의 생성자를 제거하고 대신 다른 방법을 사용하기 당신은 이런 식의 메소드를 가졌을 것입니다.

class MorseString { 
    private MorseString(){}; 
    static class Builder { 
     Builder initFromCode(String code) { 
      // .. 
      return this; 
     } 
     Builder initFromString(String str) { 
      // .. 
      return this; 
     } 
     MorseString build() { 
      // .. 
     } 
    } 
} 

// Usage: MorseString.Builder.initFromCode(foo).build(); 

매우 복잡한 생성 논리, 많은 파라미터, onl을 가진 객체를 갖고 있다면 빌더가 좋습니다. 몇 가지 예비 유효성 검사 등을 포함합니다. 팩토리 메서드는 약간 다른 매개 변수를 사용하여 개체를 만드는 여러 가지 방법을 사용하는 상황에서보다 가벼운 접근 방식입니다.

+0

이것은 아마도 전달할 String 유형에 대한 모호함을 피할 수있는 더 좋은 해결책 일 것입니다. – mellamokb

관련 문제