2013-08-12 13 views
6

私のカスタムクラスに2つのコンストラクタがあり、そのうちの1つが余分な引数をとり、最初のものすべてを行いますが、コードが1行追加されます余分な議論)、最初のコンストラクタのすべてのコードを複製することなくこれを処理するにはどうすればよいですか?2つのほとんど同じコンストラクタを扱う方法

例コード

public myConstuctor(int number, int number2){ 

    int result = (number + number2); 
    int result2 = (number2 - number1) 

    //Etc 
    //Etc 
    //Etc 
    //Etc 

} 

public myConstructor(int number1, int number2, int number 3){ 

    int result = (number + number2); 
    int result2 = (number2 - number1) 

    //Etc 
    //Etc 
    //Etc 
    //Etc 

    int result3 = (result + result2 + number3) 


} 
+0

いいえ、同じ質問ではありません。別のコンストラクタから1つのコンストラクタを呼び出す方法を具体的に求めているわけではありません。おそらく最も一般的な回答にかかわらず、重複コードを減らす方法について質問していますちょうどそれをすることです(他のコンストラクターを呼び出す) – Zippy

+0

"重複コードを削減する問題をどう対処するかを尋ねています"正しい答えではなく正しいものを選んだ。より多くのパラメータを持つコンストラクタ – nachokk

+0

@nachokk、1つの引数しか必要としないオブジェクトを作成すると、2つの引数を持つコンストラクタでコードが必要ないので、ロジック(大部分のロジック)はコンストラクタに入ります引数を2つ渡してオブジェクトを作成する必要がある場合は、元の1引数のコンストラクタのすべてのロジックを実行する必要があります。このタイプのすべてのオブジェクトが、2つの引数のコンストラクタで追加のコードが必要な場合は、1引数のコンストラクタを参照して共通のコードを実行し、次に別のコードを実行します。完全に論理的に見えますか? – Zippy

答えて

14

public MyClass(int number1, int number2, int number3) { 
    this(number1, number2); 
+0

mmmなぜ5 upvotes、@bas答えが正しいかわからない – nachokk

+0

パーフェクト。実装され、うまく働いています:-) – Zippy

+1

@nachokk:どちらの答えも正しいです。私は一般的に、より少ない引数を持つコンストラクタに、より大きな引数を持つものを呼び出す方が好きです。オペレーションのケースは、そのような順序付けが不可能かもしれないことを示唆する方法で提示されるので、SLaksは安全ルートを取ってOPのコードに一層近似した答えを提示した。可能なデフォルト値がnumber3の場合、basinの答えはオプションではありません(センチネル値を追加するか、number3をnullにすることができない限り)。ある人は、SLakのアプローチがよりクリーンであると主張するでしょう。なぜなら、それは1つの巨大なコンストラクターではなく多くの小さなコンストラクターを作るからです。 – Brian

13

あなたは他のコンストラクタを呼び出し、そこにあなたのロジックのすべてを置くことができます。

あなたが二コンストラクタは最初のものを呼び出すことができます
public myConstructor(int number, int number2){ 
    this(number, number2, 0); 
} 

public myConstructor(int number1, int number2, int number3){ 

    int result = (number + number2); 
    int result2 = (number2 - number1) 

    //Etc 
    //Etc 
    //Etc 
    //Etc 

    int result3 = (result + result2 + number3) 


} 
+0

number3に何らかの値を掛けるとどうなるでしょうか? 「result2 * = number3」と言ってください。 – Math

+0

コンストラクタの構造によっては、SLaksの方が良いかもしれません。このアプローチは、ユーザーが3つの引数を持つ 'myConstructor'を呼び出すことができたが、代わりにnumber3にデフォルトの引数が使用されていることを意味します。 @あなたの場合のデフォルトの呼び出しは 'this(number、number2、1);' – bas

+2

です。私は、あなたの解決策はコンストラクタが何をするかに依存すると思うので、スラックスの答えはすべての可能性をカバーするようです..あなたが間違っているわけではありませんが、コンストラクタが何をするかによって異なります。 – Math

6

引数は管理があまりにも多く取得する場合にも、Builderパターンを使用することができます。

MyClass obj = Myclass.set1(number1).setN2(number2).setN3(number3).build(); 

build()することができます面倒なコンストラクタを呼び出します。

+0

2つのコンストラクタを使用するよりも+1の方が良いアプローチ –

+0

これはBuilderのデザインパターンであり、使い方は正しいです。 – BVMR

+0

この@rocketboyのおかげで、面白いです。私は実際のクラス(1引数のコンストラクタと2引数のコンストラクタ)に最大2つの引数しか持たないので、SLacksの答えを使うつもりですが、ありがとう、私はこれを調べます! – Zippy

0

2番目のコンストラクターメソッド内で1番目のコンストラクターメソッドを使用し、2番目のコンストラクターメソッドで必要な新しい行を追加するだけです。

public ClassName(arg1, arg2){ 
    //etc 
} 


public ClassName(arg1,arg2,arg3){ 
this(arg1,arg2); 
//new line of code to deal with arg3; 
} 

そしてそれはそれです:)多くの時間が節約されました。

+1

異なる_names_を持つコンストラクタを使用することはできません。クラス名と一致する必要があります。 – jlordo

+0

すごくうわーXD –

+0

'CLASSNAME'は命名規則のベストプラクティスに従っていません。 'ClassName'でなければなりません – Math

関連する問題