No Programming, No Life

プログラミング関連の話題や雑記

メソッドのデフォルトパラメータ

言語でサポートされていないので、
Javaでメソッドのデフォルトパラメータを実現させるためには
オーバーロードを駆使する必要があります。

例)
class Fumo {
	void fumo() {
		fumo(false);	// デフォルトではfalseを渡す。
	}
	void fumo(boolean doFlg) {
		if (doFlg) {
			doSomething();
		}
	}
	static void doSomething() {
		// 何かしらの処理
	}
}

上記クラスFumoの使い方は
メソッド#fumo()に引数なしで呼んだ場合、メソッド#doSometing()は呼び出されない。
要するにデフォルト#fumo()を呼んだだけでは何も行われないのがデフォルトの動作となります。

メソッド#fumo()に引数として true を渡して呼んだ場合、メソッド#doSomething()が呼び出される。
#doSomething()を呼び出したい場合は、#fumo()の引数に true を指定して渡せばよいことがわかります。

ちなみに #fumo(false) という呼び出し方も可能ですが動作はデフォルトのものと同様です。

#fumo();	// デフォルト。#doSomething()は呼ばれない
#fumo(true);	// #doSomething()を動作させることを指定して呼び出し
#fumo(false);	// デフォルトと同じ動作

上記のようにオーバーロードして使う場合は修正などで以前の実装を変えずに振舞いだけ追加したい場合などにとどめるべきであると思います。オーバーロードの数が増えれば増えるほどそのメソッドの使い方を把握するのに時間を要します。初期段階からこういったメソッドが必要という設計がきちっと出来ていれば以下のようにメソッド名で切り分けた方が明確に機能が分割できると思います。

#fumo()
#fumoWithDoSomething()

Java標準ライブラリのSystem.out.println()メソッドの場合はintやStringなど様々な型を引数として受け取れるようにオーバーロードされています。オーバーロードは引数の型もしくは引数の数の組み合わせが異なればメソッドの同名定義が可能であるという機能ですが、このうち型の違いを利用する方(#println()など)は直感的に分かりやすいのですが、今回紹介した引数の数の違いを利用する方はあまり乱用するとかえってわかりずらくなってしまう恐れがあります。