メソッドに意味のある名称をつける(オーバーロード) 戻る
hogehogeってなんだ?

特に意味が無い言葉を表現するとき、英語圏の技術書では「hogehoge」「foo」「bar」等と表記します。日本でいうと書類のサンプルにある「山田太郎」さんのようなものです。(全国の山田太郎さんごめんなさい)

話がそれてしまったので本題に戻ります。先ほど意味のある名称をつけろと変数名で記述していたのに、メソッド名が何をするためのメソッドかわかりません。実際のところこのメソッドは何をしているメソッドなのでしょうか。このプログラム全体のうちhogehogeが行なっている作業は「画面に表示するメッセージを作成している」になります。よってこのメソッドの名称はhogehogeからcreateMessageに変更したいと思います。

このように名称に意味を持たせないと、何をしているメソッドかわからなくなるのできちんと名称を付けましょう。

メソッド名に意味をもたせた具体例 class Sample { static final String MESSAGE_1ST = "私は"; static final String MESSAGE_2ND = "です。"; static final String MESSAGE_3RD = "歳" + MESSAGE_2ND; public static void main(String[] args) { Sample instance = new Sample(); String message; message = instance.createMessage(args); System.out.println(message); } String createMessage(String[] args) { String name = args[0]; int age = Integer.parseInt(args[1]); return MESSAGE_1ST + name + MESSAGE_2ND + age + MESSAGE_3RD; } }
オーバーロード

上記のサンプルですが、メソッド名がcreateMessageということでメッセージ作成のためのメソッドということはわかります。ですが上記のままだとパラメータをいくつ渡すと的確に動作するのかわからないためとても不親切なソースです。パラメータを以下のように変更したいと思います。このように変更することでパラメータが2つ渡されるということが明確になります。

パラメータが2つあるメソッド String createMessage1(String name, String age) { return MESSAGE_1ST + name + MESSAGE_2ND + age + MESSAGE_3RD; }

もう少し変更します。年齢は整数なのでStringからintに変更します。利用者にとってだいぶ親切になりました。

第2パラメータをint型に変更 String createMessage2(String name, int age) { return MESSAGE_1ST + name + MESSAGE_2ND + age + MESSAGE_3RD; }

これを1つのプログラムにまとめてみます。さてcreateMessageメソッドが3つありますがどれが本物のメッセージ作成メソッドでしょうか。答えは全て本物です。どれもメッセージを作成しているのです。

1つのプログラムにまとめた class Sample { static final String MESSAGE_1ST = "私は"; static final String MESSAGE_2ND = "です。"; static final String MESSAGE_3RD = "歳" + MESSAGE_2ND; public static void main(String[] args) { Sample instance = new Sample(); String message; message = instance.hogehoge(args); // インスタンス化してからでないとhogehogeメソッドは呼び出せない。 System.out.println(message); } String createMessage(String[] args) { String name = args[0]; int age = Integer.parseInt(args[1]); return MESSAGE_1ST + name + MESSAGE_2ND + age + MESSAGE_3RD; } String createMessage1(String name, String age) { return MESSAGE_1ST + name + MESSAGE_2ND + age + MESSAGE_3RD; } String createMessage2(String name, int age) { return MESSAGE_1ST + name + MESSAGE_2ND + age + MESSAGE_3RD; } }

このようなときJavaでは同じ名称でパラメータが違うメソッドを複数記述することができます(つまり1や2を書かずに取り除くことができます。なので取り除いておきましょう。)。この機能のことを「オーバーロード」と呼びます。同じ目的で作られたメソッドなのですから、メソッド名称が一致するように実装すべきです。

事実上2つは不要では?という意見もありますが、いろいろなパラメータに対応しているということで、せっかく実装したのですから残しておきましょう。

改修がたいへん

先ほどのサンプルのメッセージのうち「名前」と「年齢」の出力順を逆に変更しようと思います。先程までのプログラムだとは3箇所変更しなければなりません。今後上記のようなメソッドが3つから4つ5つと増えたら改修は更に困難になってきます。

「createMessage(String[])」と「createMessage(String, String)」は似ているので呼び出すことにします。「createMessage(String[])」の内容を以下のように変更したいと思います。

他のメソッドを呼び出す1 String createMessage(String[] args) { String name = args[0]; String age = args[1]; String result = createMessage(name, age); return result; }

同様に「createMessage(String, String)」も以下のように変更したいと思います。

他のメソッドを呼び出す2 String createMessage(String name, String age) { int ageInt = Integer.parseInt(age); String result = createMessage(name, ageInt); return result; }

最終的には以下のようになります。これで1箇所変更することで、全てのメソッドに対応できます。

1箇所を変更することで、全てのメソッドを対応できる例 class Sample { static final String MESSAGE_1ST = "私は"; static final String MESSAGE_2ND = "です。"; static final String MESSAGE_3RD = "歳" + MESSAGE_2ND; public static void main(String[] args) { Sample instance = new Sample(); String message; message = instance.createMessage(args); System.out.println(message); } String createMessage(String[] args) { String name = args[0]; String age = args[1]; String result = createMessage(name, age); return result; } String createMessage(String name, String age) { int ageInt = Integer.parseInt(age); String result = createMessage(name, ageInt); return result; } String createMessage(String name, int age) { return age + MESSAGE_3RD + MESSAGE_1ST + name + MESSAGE_2ND; } }

このように同じ目的で作成されたメソッドは、オーバーロードを用いて同一名称にしましょう。