Java以外のプログラミング言語からJavaに移ってきたプログラマーの中には、Javaのメソッド引数に対してデフォルトパラメーターを設定出来ないことに戸惑ってしまう方も多いのではないでしょうか。
本記事では、Javaでデフォルト引数の代わりとして使える実装方法についてご紹介していきます。
目次
デフォルト引数とは

そもそもデフォルト引数とは何かですが、メソッドなどを呼び出す際に引数の値が指定されなかった場合に自動的に設定される値のことを指します。
JavaScriptのデフォルト引数
設定方法はプログラミング言語にもよりますが、例えばJavaScriptの場合「引数=デフォルト値」の指定で設定することが可能です。
function addMethod(a, b = 1) {
return a + b;
}
console.log(addMethod(1, 2)); // 出力結果は3
console.log(addMethod(1)); // 出力結果は2
2つ目のコンソール出力に呼び出しているメソッド引数には、第2引数の値を設定していないため、1行目に記載されたデフォルト値である1が設定された結果が出力されます。
なぜJavaにはデフォルト引数がない?
他のプログラミング言語では利用出来るデフォルト引数が、なぜJavaで提供されていないのか明確な理由は分かりません。
一説としては引数をデフォルト値として設定することは、可読性を落とす原因になるからとされています。
ただ、実際デフォルト引数があれば良いのにと思うケースもあるとは思いますので、Javaで代替出来る手段について後述していきます。
Javaでのデフォルト引数代替1: オーバーロード

Javaでデフォルト引数の代替として利用される割合が一番高いのが「オーバーロード」を使った手法です。
サンプル
package sample;
public class Main {
public static void main(String[] args) {
testMethod();
testMethod("佐藤わたる");
testMethod("鈴木たかし", 22);
}
public static void testMethod() {
String name = "山田太郎";
int age = 30;
System.out.println("名前: " + name + " 年齢: " + age);
}
public static void testMethod(String name) {
int age = 30;
System.out.println("名前: " + name + " 年齢: " + age);
}
public static void testMethod(String name, int age) {
System.out.println("名前: " + name + " 年齢: " + age);
}
}
実行した結果が下記です。
名前: 山田太郎 年齢: 30 名前: 佐藤わたる 年齢: 30 名前: 鈴木たかし 年齢: 22
解説
Javaではオーバーロードと呼ばれる機能により、同名のメソッドでも引数が異なれば複数定義出来る機能が提供されています。
このオーバーロード機能により、引数として指定されなかった値を変数のデフォルト値として定義しておき利用することで、デフォルト引数を定義した場合と同じような処理を作成することが出来ます。
サンプルの例では11~24行目で定義された3つのメソッドが同名となっており、引数に設定した値によって出力結果が変わっていることを確認出来ます。
Javaでのデフォルト引数代替2: nullチェック

メソッド自体は1つしか用意せずに、引数がnullの値かを判定して、必要であればデフォルト値を設定する方法でも代替出来ます。
サンプル
package sample;
public class Main {
public static void main(String[] args) {
testMethod(null, null);
testMethod("佐藤わたる", null);
testMethod("鈴木たかし", "東京都");
}
public static void testMethod(String name, String address) {
if(name == null) {
name = "名無し";
}
if(address == null) {
address = "不明";
}
System.out.println("名前: " + name + " 住所: " + address);
}
}
実行結果が下記です。
名前: 名無し 住所: 不明 名前: 佐藤わたる 住所: 不明 名前: 鈴木たかし 住所: 東京都
解説
nullチェックの場合には、メソッドの最初でnullの代わりにデフォルト値を設定してしまう方法です。
このやり方では、呼び出し元側で使わない引数であったとしてもnull値を指定しなければいけないところが不便です。
またint型などnullを許容しないデータ型の場合には、どういった対応にするのかなどを共通認識として決めておかないと思わぬバグを埋め込んでしまう可能性も否定できません。
Javaでのデフォルト引数代替3: 可変引数

Javaでは同じ型の引数に限定されますが、引数の数を指定せずに定義出来る可変引数の機能が利用可能です。
サンプル
package sample;
public class Main {
public static void main(String[] args) {
testMethod();
testMethod("山田太郎");
testMethod("佐藤わたる", "鈴木たかし");
testMethod("田中いちろう", "田中じろう", "田中さぶろう");
}
public static void testMethod(String... names) {
System.out.println("メソッド処理開始");
for(String name: names) {
System.out.println("名前: " + name);
}
}
}
実行した結果が下記です。
メソッド処理開始 メソッド処理開始 名前: 山田太郎 メソッド処理開始 名前: 佐藤わたる 名前: 鈴木たかし メソッド処理開始 名前: 田中いちろう 名前: 田中じろう 名前: 田中さぶろう
解説
12行目のメソッドで引数に記述しているの「データ型… 変数名」の書き方が可変引数の設定方法です。
異なるデータ型を複数利用することは出来ませんが、同一の引数であれば上述したオーバーライド機能のような利用が可能です。
デフォルト引数の利用方法とは多少異なりますが、要件によっては可変引数を使うことでも実現可能です。
さいごに: Javaではデフォルト引数が使えないことを留意しておこう

本記事では、Javaでデフォルト引数の代わりとして使える実装方法についてご紹介してきました。
Javaで他のプログラミング言語のようにデフォルト引数を指定しようとするとコンパイルエラーとなるため、あらかじめ留意しておく必要があります。
今回ご紹介した方法の中でもオーバーロードを用いたデフォルト引数の代替方法が一般的ですので、まずはオーバーロードで代用できないかを検討してみるのがおすすめです。