1. 概要

この短いチュートリアルでは、メソッドのオーバーロードを使用してJavaのデフォルトパラメーターをシミュレートする方法を示します。

ここでは、他の特定のOOP言語(C ++やScalaなど)とは異なり、Java仕様はメソッドパラメーターへのデフォルト値の割り当てをサポートしていないためシミュレーションと言います。

2. 例

例として、お茶を作ってみましょう! まず、 TeaPOJOが必要です。

public class Tea {

    static final int DEFAULT_TEA_POWDER = 1;

    private String name; 
    private int milk;
    private boolean herbs;
    private int sugar;
    private int teaPowder;

    // standard getters 
}

ここで、 name は必須フィールドです。これは、Teaに少なくとも名前が必要であるためです。

そうすると、お茶の粉がないとお茶はありえません。 したがって、呼び出し時に提供されない場合、ユーザーはお茶に標準の大さじ1 teaPowderを望んでいると想定します。 これが最初のデフォルトパラメータです。

その他のオプションのパラメーターは、 milk (ml)、 herbs (追加するかどうか)、および sugar (tbsp)です。 それらの値のいずれかが提供されていない場合、ユーザーはそれらを望まないと想定します。

メソッドのオーバーロードを使用してJavaでこれを実現する方法を見てみましょう。

public Tea(String name, int milk, boolean herbs, int sugar, int teaPowder) {
    this.name = name;
    this.milk = milk;
    this.herbs = herbs;
    this.sugar = sugar;
    this.teaPowder = teaPowder;
}

public Tea(String name, int milk, boolean herbs, int sugar) {
    this(name, milk, herbs, sugar, DEFAULT_TEA_POWDER);
}

public Tea(String name, int milk, boolean herbs) {
    this(name, milk, herbs, 0);
}

public Tea(String name, int milk) {
    this(name, milk, false);
}

public Tea(String name) {
    this(name, 0);
}

明らかなように、ここではコンストラクターチェーンを使用しています。これは、メソッドパラメーターにいくつかのデフォルト値を提供するためのオーバーロードの形式です。

次に、これが実際に動作することを確認するための簡単なテストを追加しましょう。

@Test
public void whenTeaWithOnlyName_thenCreateDefaultTea() {
    Tea blackTea = new Tea("Black Tea");

    assertThat(blackTea.getName()).isEqualTo("Black Tea");
    assertThat(blackTea.getMilk()).isEqualTo(0);
    assertThat(blackTea.isHerbs()).isFalse();
    assertThat(blackTea.getSugar()).isEqualTo(0);
    assertThat(blackTea.getTeaPowder()).isEqualTo(Tea.DEFAULT_TEA_POWDER);
}

3. 代替案

Javaでデフォルトのパラメータシミュレーションを実現する方法は他にもあります。 それらのいくつかは次のとおりです。

この例でnull引数を許可する3番目の方法を利用する方法は次のとおりです。

public Tea(String name, Integer milk, Boolean herbs, Integer sugar, Integer teaPowder) {
    this.name = name;
    this.milk = milk == null ? 0 : milk.intValue();
    this.herbs = herbs == null ? false : herbs.booleanValue();
    this.sugar = sugar == null ? 0 : sugar.intValue();
    this.teaPowder = teaPowder == null ? DEFAULT_TEA_POWDER : teaPowder.intValue();
}

4. 結論

この記事では、メソッドのオーバーロードを使用してJavaのデフォルトパラメータをシミュレートする方法について説明しました。

同じことを実現する方法は他にもありますが、オーバーロードは最もクリーンでシンプルです。 いつものように、コードはGitHubから入手できます。