Javaにはデフォルトパラメーターはない!!代替方法を徹底解説!
デフォルト引数とは、メソッドを呼び出す際に引数の値が未設定であればデフォルト値を指定できることを指します。
Javaにはデフォルトのパラメーターはありませんが、代替え方法はいくつかあります。
C ++やJavaScriptなど最近のプログラミング言語には、引数に値を指定せずに関数を呼び出すオプションがあります。ですが、Javaのデフォルトパラメータでは、ほかの言語より少しコードを書かないといけません。
ここでは、Javaでデフォルトのメソッドパラメータがどのように機能するかを学びます。
Javaのデフォルトパラメータ
Javaでは、パラメーターの値が事前に定義されているメソッドを宣言することはできません。ですが、簡単なコード構成で実現ができます。
他のプログラミング言語で知られている動作を実装するために使用できる方法がいくつかあります。
・メソッドのオーバーロードを使用する
・入力としてnullを許可する
・Java Varargsでメソッドを宣言する
これらの方法を詳しく見てみましょう。
Javaのデフォルトのメソッドパラメータをオーバーロードを使って実装
Javaでデフォルトのメソッドパラメータを実装する為に一番いい方法は、メソッドのオーバーロードを使用することです。メソッドのオーバーロードを使用すると、同じ名前でパラメーターの数が異なる複数のメソッドを宣言できます。
メソッドのオーバーロードを使用してデフォルトのメソッドパラメータを実装する方法
下記サンプルは、引数の数でメソッドの参照先を変える例です。
1 2 3 4 5 6 7 |
List<Document> search(String query) { return search(query, 10, 0); } List<Document> search(String query, Integer limit, Integer offset) { // method implementation } |
唯一の必須パラメーターはクエリ文字列です。見てわかるように、パラメーターの数が最も多いメソッドを実装するだけで済みます。
この単純なメソッドは、そのパラメーターをより複雑なメソッドに渡し、方法の引数にデフォルトのパラメーター値を渡してるにすぎません。
他の方法と比較して、メソッドのオーバーロードを使う1番のメリットは、コードの単純さです。パラメーターセットの内容を簡単に理解する事ができます。
Javaのデフォルトパラメータを使う時は、オーバーロードをお勧めしますが、他の使い方も知っておいた方がいいです。
Null渡し
もう一つの方法は、NULL受け入れ可能なパラメーターを受け入れるメソッドを宣言する方法です。メソッドの実装部分で、どのパラメーターがnullであるかを確認し、それらにデフォルト値を割り当てます。
この方法の例は、下記になります。
1 2 3 4 5 6 7 8 9 |
List<Result> search(String query, Integer limit, Integer offset) { if (limit == null) { limit = 10; } if (offset == null) { offset = 0; } // method implementation } |
この方法は、2つの欠点があります。1つ目は、渡す引数の一部がnullであってもすべての引数を渡す必要がある点です。2つ目は、メソッドの宣言を見ただけではどれがnullを許容するか分からない為、どのパラメーターがnull可能かを認識する必要がある点です。
また開発者がコードを追跡するのが難しくなる為、あまりいい方法とは言えないでしょう。
余談ですが、Java 8 Optionalクラス内で必要とされないパラメーターのラッピングを考える人もいますが、この方法タイプは、入力ではなくメソッドの出力用に設計されています。
Varargsパラメーター
Varargs方法は、同じ型の引数にのみに制限されています。よって、Javaメソッドのデフォルトパラメータの問題は実際には解決されません。ですが、場合によってはそれを検討することもありでしょう。
1 2 3 4 |
User createUser(String login, Right... rights) { rights = User.DEFAULT_RIGHTS; // implementation } |
Varargsを単一の方法パラメータとして使用することも可能です。この方法を使う場合は、デフォルト値を使用するためにnullを渡す必要はありません。ですが、バグやハッキングされるリスクが高まります。これを使うのであれば、メソッドのオーバーロードを使うことをお勧めします。
Ryotin
現役フリーランスエンジニアです。使ってるエージェントはフライテック!得意言語はJava。月収は75万円。SESのフリーランスではこれ以上稼ぐのは厳しそう...とはいってもサラリーマンの時より倍の収入だから家族も喜んでるけどね!