バナー画像

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で他のプログラミング言語のようにデフォルト引数を指定しようとするとコンパイルエラーとなるため、あらかじめ留意しておく必要があります。

今回ご紹介した方法の中でもオーバーロードを用いたデフォルト引数の代替方法が一般的ですので、まずはオーバーロードで代用できないかを検討してみるのがおすすめです。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。