2012-02-22 6 views
3

1つの必須パラメータと1つのオプションのパラメータが必要なメソッドを作成したいのですが、パラメータ(int ... b)を使用してオプションの配列を作成する方法が見つかりましたが、これは配列の場合、この値がnullであるか、ユーザーが入力したかのどちらかにしたいのですが、同じ名前の2つのメソッドを作成して1つのパラメーターを持つメソッドと2つのパラメーターを持つメソッドを作成できます1つの方法で完了しましたか?メソッドのjavaオプションのパラメータ

ありがとうございました

+0

受け入れてあなたはここで良い答えの多くは、あなたが答えの1つのマークができていたにもありますがありますか?これはSOコミュニティの改善に役立ちます。ありがとうございました! –

答えて

7

いいえ、Javaでは省略可能なパラメータはサポートされていません。オーバーロードのもう1つの選択肢(2つのパラメータにはあまり意味がありませんが、のようになります)は、すべてのパラメータを表すBuilderタイプを使用することです。必要なパラメータを含むビルダーのコンストラクタを提供できます。オプションのそれぞれのセッターを使用して、セッターがビルダー自体を返すようにします。

foo.doSomething(new ParameterBuilder(10).setBar(2).setBaz(10)); 
+0

ありがとうございましたJon、私はクラスのヘルパーメソッドのオプションのパラメータを使用してコンストラクタの書き込みではないが、あなたが言ったように、オーバーロードが最適な選択だと思われます ありがとう –

+0

@ aizen92: in *コンストラクタ - 私が議論していたコンストラクタは、ParameterBuilder型のもので、これはこれらのパラメータを収集するための新しい型になります。このような状況では過度の攻撃ですが、他の場所では有用なパターンになる可能性があります。 –

1

いいえ、これはメソッドのオーバーロードは、Javaのメソッドのパラメータには、「デフォルト」の値がありません

+2

私は、それが「オーバーロード」とは何かを「正確に」言っているわけではありません。そうでなければ、オプションのパラメータを持つ言語はオーバーロードしません。オーバーロードの1つの可能な使用*です。 –

1

ためですまさにです:だからメソッドを呼び出すと、のようなものになります。 varargsまたはメソッドのオーバーロードを使用します。

+0

あなたの助けに感謝Binyamin、それはオーバーロードが最高です –

0

javaでは、これはメソッドオーバーロードと呼ばれるものによって実行されます。同じ名前でパラメータは異なる複数のメソッドを作成できます。例えば

:あなたのコードの

void method1(String arg1){ 
    // only one argument, here you can delegate the work of this method to the implementation that takes the most parameters and pass null for the optional parameters. 
    method1(arg1, null); 
} 

void method1(String ar1, String arg2){ 
    // do work, handle the case where arg2 is null. 
} 

クライアントは、どちらか一方を呼び出すことができます。それらには、2番目の引数がオプションであるかのように見えます。

3

あなたが探しているのは、デフォルトの引数のサポートです。 Javaにはこの機能はありませんが、この機能を多かれ少なかれシミュレートします。

単純な方法の1つは、メソッドのオーバーロードを使用することです。

別のアプローチは、特殊なケースを直接識別して、デフォルト値で置き換えることです。

はここイヴォLimmenにより、これらのアプローチの両方を混合する例です:私が見つけ

public void test() { 
    this.test(null, null); 
} 
public void test(String p1) { 
    this.test(null, null); 
} 
public void test(String p1, String p2) { 
    if(p1 == null) { 
     ... 
    } else { 
     ... 
    } 
    if(p2 == null) { 
     ... 
    } else { 
     ... 
    } 
} 

非常に興味深いアプローチは、デザインビルダーパターンを使用することです。例here

興味深い議論here

関連する問題