web-dev-qa-db-ja.com

デフォルトのメソッド引数値を設定する方法は?

Javaでデフォルトのメソッドパラメータ値を設定することは可能ですか?

例:メソッドがある場合

public int doSomething(int arg1, int arg2)
{
//some logic here
    return 0;
}

パラメータの有無にかかわらず呼び出すことができるように、特定のメソッドを変更することは可能ですか?

例:

doSomething(param1, param2);
doSomething();

ありがとう!

12
Niko Gamulin

メソッドのオーバーロードでこれを実現できます。

public int doSomething(int arg1, int arg2)
{
        return 0;
}

public int doSomething()
{
        return doSomething(defaultValue0, defaultValue1);
}

このパラメーターなしメソッドを作成することにより、ユーザーはパラメーターなしメソッドの実装内で指定したデフォルトの引数を使用して、パラメーターフルメソッドを呼び出すことができます。これはoverloadingメソッドとして知られています。

48
Andrew Hare

引数が同じ型の場合は、varargsを使用できます。

public int something(int... args) {
    int a = 0;
    int b = 0;
    if (args.length > 0) {
      a = args[0];
    }
    if (args.length > 1) {
      b = args[1];
    }
    return a + b
}

しかし、この方法では、個々の引数のセマンティクスが失われます。

パラメータ化されたバージョンへの呼び出しを中継するオーバーロードされたメソッドがあります

public int something() {
  return something(1, 2);
}

または、メソッドが何らかの初期化手順の一部である場合は、代わりにビルダーパターンを使用できます。

class FoodBuilder {
   int saltAmount;
   int meatAmount;
   FoodBuilder setSaltAmount(int saltAmount) {
       this.saltAmount = saltAmount;
       return this;
   }
   FoodBuilder setMeatAmount(int meatAmount) {
       this.meatAmount = meatAmount;
       return this;
   }
   Food build() {
       return new Food(saltAmount, meatAmount);
   }
}

Food f = new FoodBuilder().setSaltAmount(10).build();
Food f2 = new FoodBuilder().setSaltAmount(10).setMeatAmount(5).build();

次に、Foodオブジェクトを操作します

int doSomething(Food f) {
    return f.getSaltAmount() + f.getMeatAmount();
}

ビルダーパターンを使用すると、後でパラメーターを追加/削除することができ、パラメーターの新しいオーバーロードメソッドを作成する必要はありません。

15
akarnokd

いいえ。JavaはC++のようなデフォルトのパラメータをサポートしていません。別のメソッドを定義する必要があります:

public int doSomething()
{
   return doSomething(value1, value2);
}
8
kgiannakakis

C#のようにパラメーターのデフォルト値を宣言することはできません(私はそう思います)が、オーバーロードを作成するだけで済みます。

public int doSomething(int arg1, int arg2) {
    //some logic here
    return 0;
}

//overload supplies default values of 1 and 2
public int doSomething() {
    return doSomething(1, 2);
}

このようなことをするつもりなら、あなたのコードを扱う他の誰もが賛成してください、そしてあなたが使用しているデフォルト値が何であるかをJavadocコメントで必ず言及してください!

3
matt b

Javaでデフォルト値を設定することはできません。これに対処するための私の好ましい方法はoverloadメソッドであるため、次のようになります。

public class MyClass
{
  public int doSomething(int arg1, int arg2)
  {
    ...
  }

  public int doSomething()
  {
    return doSomething(<default value>, <default value>);
  }
}
2
Nick Holt

さまざまなパラメーターでメソッドをオーバーロードできます。

public int doSomething(int arg1, int arg2)
{
//some logic here
        return 0;
}

public int doSomething(
{
doSomething(0,0)
}
1

うまくいけば私は誤解していない このドキュメント ですが、Java 1.8を使用している場合、理論的には、デフォルトのメソッドの動作する実装を定義することでこのようなことを達成できます( 「ディフェンダーメソッド」)を実装するインターフェイス内。

interface DoInterface {
    void doNothing();
    public default void remove() {
       throw new UnsupportedOperationException("remove");
    }
    public default int doSomething( int arg1, int arg2) {
        val = arg1 + arg2 * arg1;
        log( "Value is: " + val );
        return val;
    }
}
class DoIt extends DoInterface {
    DoIt() {
        log("Called DoIt constructor.");
    }
    public int doSomething() {
        int val = doSomething( 0, 100 );
        return val;
    }
}

次に、どちらかの方法で呼び出します。

DoIt d = new DoIt();
d.doSomething();
d.soSomething( 5, 45 );
1
djangofan