2013-04-18 4 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"; 
    } 
} 

Как я могу это сделать без кода повторения длинная строка? Я бы назвал конструктор this() конструктором в ветке else, но это невозможно.

ответ

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

Вы имеете в виду 'this', а не' super'. –

+0

@TomAnderson Да, спасибо, я исправил его – kan

+0

Я думаю, что это лучшее решение. Благодарю. – balent

1

Как это:

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

Это не похоже на компиляцию –

+1

Имущество является окончательным, это не скомпилируется. – balent

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

это не отвечает на вопрос ... строка 'firstReallyLongDefaultString' по-прежнему должна повторяться в этом конструкторе –

+0

@Heuster, который можно легко переместить в статическую константу –

+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); 
} 

Это не может быть унаследовано в подклассах, однако, если вы хотите, чтобы ваш класс строго неизменен это должно быть окончательным.

Смежные вопросы