2013-04-18 1 views
0

불변 클래스가 있고 두 생성자에서 코드를 복제하지 않고 새로운 생성자를 추가하려고합니다.Java 생성자 연결 및 코드 반복 방지

public class Test { 
    private final String stringParameter; 

    public Test() { 
     stringParameter = "firstReallyLongDefaultString"; 
    } 

    public Test(String s) { 
     stringParameter = s; 
    } 
} 

그리고이 같은 "문자"매개 변수, 뭔가 새로운 생성자를 추가 할 :

나는 클래스가

public Test(char s) { 
    if(Character.isLetter(s)) { 
     stringParameter = "firstReallyLong" + s + "DefaultString"; 
    } else { 
     stringParameter = "firstReallyLongDefaultString"; 
    } 
} 

나는의 코드를 반복하지 않고 그것을 할 수있는 방법 긴 끈? else 브랜치에서 "this()"생성자를 호출하고 싶습니다.하지만 불가능합니다. 이처럼

답변

1

:

public class Test { 
    private static final String DEFAULT_VALUE = "firstReallyLongDefaultString"; 
    private final String stringParameter; 

    public Test() { 
     this(DEFAULT_VALUE); 
    } 

    public Test(String s) { 
     stringParameter = s; 
    } 

    public Test(char c) { 
     this(prepareString(c)); 
    } 

    private static String prepareString(char c) { 
     if(Character.isLetter(s)) { 
      return "firstReallyLong" + s + "DefaultString"; 
     } else { 
      return DEFAULT_VALUE; 
     } 
    } 

} 

"firstReallyLongDefaultString" 반복을 피하기 위해 개인 일정으로 수행 할 수 더 잘 .

+0

'슈퍼'보다는 '이'를 의미합니다. –

+0

@TomAnderson 네, 고마워요. 고쳤습니다. – kan

+0

이것이 최선의 해결책이라고 생각합니다. 감사. – balent

1

: 또한 일부 코드의 반복을 제거, 더 명시 적으로 체인 수

public Test(char s) { 
    super(); 
    if(Character.isLetter(s)) { 
     stringParameter = "firstReallyLong" + s + "DefaultString"; 
    } 
} 
+0

이것은 컴파일하지 않는 것입니다. –

+1

속성이 final입니다. 컴파일되지 않습니다. – balent

2
public Test(char s) { 
    this(Character.isLetter(s) ? "firstReallyLong" + s + "DefaultString" : "firstReallyLongDefaultString"); 
} 
+0

질문에 대답하지 않습니다. 문자열 firstReallyLongDefaultString을이 생성자에서 반복해야합니다. –

+0

정적 상수 –

+0

으로 쉽게 이동할 수 있습니다. 원래 생성자를 변경할 수 없다면 질문에 답할 수 있습니다.) –

0

팩토리 메소드는 당신에게 더 많은 유연성을 제공 :

public static Test create(char c) { 
    final String parameter; 
    if(Character.isLetter(s)) { 
     parameter = "firstReallyLong" + s + "DefaultString"; 
    } else { 
     parameter = "firstReallyLongDefaultString"; 
    } 
    return new Test(parameter); 
} 

이것은 당신이 당신의 클래스가 최종해야 엄격 불변되고 싶어하지만 경우, 서브 클래스에 상속 될 수 없습니다.