Javaのデフォルトメソッドとは?defaultキーワードの使い方をサンプル付きで解説
Javaにおけるインターフェースはクラスによく似ていますが、含まれているのは抽象メソッドと、finalかつstaticなフィールドのみです。
- インターフェースは、メソッドのプロトタイプ(シグネチャ)を定めた仕様書のようなものです。プログラマに実装方針を示したい場合や、ある型のメソッドやフィールドがどのようにあるべきかという契約(コントラクト)を定めたいときに利用します。
- 自作のクラスに特定の仕様へ準拠させたい場合は、対応するインターフェースを実装し、その中のすべての抽象メソッドに本体(処理内容)を記述する必要があります。
- インターフェースの抽象メソッドを1つでも実装し忘れると、コンパイル時エラーが発生します。
インターフェースに新しいメソッドが追加されたらどうなる?
ここで問題になるのが、インターフェースの後からの変更です。あるインターフェースを実装したクラス群を運用していたところ、後日そのインターフェースに新しいメソッドが追加されたとしましょう。この場合、追加されたメソッドを各クラスすべてで実装し直さない限り、既存のコードはコンパイルエラーとなり動作しなくなってしまいます。
この課題を解決するために、Java 8で導入されたのがデフォルトメソッドです。
デフォルトメソッドとは
デフォルトメソッドは「防御メソッド(defender method)」や「仮想拡張メソッド(virtual extension method)」とも呼ばれます。defaultキーワードを使うことで、インターフェース側にあらかじめデフォルトの実装を持たせられます。
default void display() {
System.out.println("これはデフォルトメソッドです");
}インターフェース内のメソッドに一度デフォルト実装を書いておけば、すでにそのインターフェースを実装している既存クラス側で改めてオーバーライドする必要はありません。これにより、インターフェースの進化(メソッド追加)が既存コードを壊すことを防げます。
サンプルコード
以下のJavaサンプルは、デフォルトメソッドの基本的な使い方を示したものです。
interface SampleInterface {
public void demo();
default void display() {
System.out.println("これはデフォルトメソッドです");
}
}
public class DefaultMethodExample implements SampleInterface {
public void demo() {
System.out.println("demoメソッドの実装です");
}
public static void main(String args[]) {
DefaultMethodExample obj = new DefaultMethodExample();
obj.demo();
obj.display();
}
}実行結果
demoメソッドの実装です これはデフォルトメソッドです
このように、display()はDefaultMethodExampleクラス内で実装していませんが、インターフェース側のデフォルト実装がそのまま呼び出されていることが分かります。
補足:複数インターフェース実装時の注意点
異なるインターフェースに同じシグネチャのデフォルトメソッドが存在する場合、両方を同時に実装するクラスではコンパイルエラーになります。この場合は、クラス側で該当メソッドを必ずオーバーライドする必要があります。この仕組みによって、多重継承で問題となる「ダイヤモンド問題」が回避されています。
-
Javaのpack()メソッドとは?使い方とsetSize()との違いを解説
pack()メソッドは、JavaのWindowクラスで定義されているメソッドで、フレーム内のすべてのコンポーネントがそれぞれの推奨サイズ(preferred size)以上で表示されるように、ウィンドウのサイズを自動的に調整します。 代替手段として、setSize()メソッドやsetBounds()メソッドを呼び出して、フレームのサイズを明示的に指定する方法もあります。しかし一般的には、pack()メソッドを使用する方がsetSize()よりも推奨されています。その理由は、pack()がフレームのサイズ決定をレイアウトマネージャーに委ねることができ、レイアウトマネージャーはプラットフォーム間の
-
JavaのsetBounds()メソッドとは?使い方とサンプルコードを解説
JavaのGUIプログラミングでは、レイアウトマネージャー(Layout Manager)がコンポーネントの位置やサイズを自動的に決定します。しかし、レイアウトマネージャーを使用しない場合は、コンポーネントの位置とサイズを手動で設定する必要があります。そのような場面で活躍するのがsetBounds()メソッドです。フレームのレイアウトマネージャーをnullに設定することで、コンポーネントの位置とサイズを自由に指定できるようになります。setBounds()メソッドの基本setBounds()メソッドは4つの引数を取ります。第1引数と第2引数はコンポーネントの左上隅のx座標・y座標、第3引数はコ