Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
Javaインターフェース解説
Javaインターフェースは、実装クラスが遵守しなければならない契約を定義します。抽象化、多重継承を可能にし、クリーンでモジュール化されたアーキテクチャを促進します。
インターフェースの定義
インターフェースは完全に抽象的な型です。すべてのメソッドは暗黙的にpublic abstract、すべてのフィールドはpublic static finalです。interfaceキーワードで宣言します:
interface Language { void getType(); void getVersion(); }
ここでは、Languageは2つの抽象メソッドを含むインターフェースです。
インターフェースの実装
インターフェースはインスタンス化できません。クラスはimplementsキーワードで実装し、すべての抽象メソッドに具象ボディを提供します。
例1:Polygonインターフェース
interface Polygon { void getArea(int length, int breadth); } class Rectangle implements Polygon { @Override public void getArea(int length, int breadth) { System.out.println("The area of the rectangle is " + (length * breadth)); } } class Main { public static void main(String[] args) { Rectangle r = new Rectangle(); r.getArea(5, 6); } }
出力:
The area of the rectangle is 30
例2:Languageインターフェース
interface Language { void getName(String name); } class ProgrammingLanguage implements Language { @Override public void getName(String name) { System.out.println("Programming Language: " + name); } } class Main { public static void main(String[] args) { ProgrammingLanguage lang = new ProgrammingLanguage(); lang.getName("Java"); } }
出力:
Programming Language: Java
複数インターフェースの実装
クラスはいくつかのインターフェースを実装できます:
interface A { /* メンバ */ } interface B { /* メンバ */ } class C implements A, B { /* 実装 */ }
インターフェースの拡張
インターフェースはextendsで他のインターフェースを拡張できます:
interface Line { /* メンバ */ } interface Polygon extends Line { /* メンバ */ }
Polygonを実装するクラスは、LineとPolygon両方のメンバメソッドを提供しなければなりません。
複数インターフェースの拡張
interface A { /* ... */ } interface B { /* ... */ } interface C extends A, B { /* ... */ }
なぜインターフェースを使うのか?
- 抽象化:実装を指定せず操作を定義し、クラスごとに異なる振る舞いを可能にする。
- 仕様:実装クラスが満たすべき明確な契約を設定する。
- 多重継承:クラスが複数のソースから振る舞いを採用できる。
- デフォルト可視性:すべてのメソッドは暗黙的に
public、フィールドはpublic static final。
暗黙的な定数の例:
interface Language { String TYPE = "programming language"; // 暗黙的にpublic static final void getName(); // 暗黙的にpublic }
デフォルトメソッド(Java 8+)
Java 8でdefaultメソッドが導入され、インターフェースに具象メソッドボディを持たせられるようになりました:
default void getSides() { System.out.println("I can get sides of a polygon."); }
デフォルトメソッドにより、既存実装を壊さずにインターフェースに新メソッドを追加でき、後方互換性が確保されます。
例:デフォルトメソッドの使用
interface Polygon { void getArea(); default void getSides() { System.out.println("I can get sides of a polygon."); } } class Rectangle implements Polygon { @Override public void getArea() { int length = 6; int breadth = 5; int area = length * breadth; System.out.println("The area of the rectangle is " + area); } @Override public void getSides() { System.out.println("I have 4 sides."); } } class Square implements Polygon { @Override public void getArea() { int length = 5; int area = length * length; System.out.println("The area of the square is " + area); } } class Main { public static void main(String[] args) { Rectangle r = new Rectangle(); r.getArea(); r.getSides(); Square s = new Square(); s.getArea(); s.getSides(); } }
出力:
The area of the rectangle is 30 I have 4 sides. The area of the square is 25 I can get sides of a polygon.
StaticとPrivateメソッド(Java 9+)
インターフェースにはstaticメソッドを含められ、インターフェース名で呼び出せます:
interface Polygon { static void helper() { /* ... */ } } Polygon.helper();
Privateメソッドは他のインターフェースメソッドの内部ユーティリティを提供し、カプセル化を保証します。
実践例:多角形の計算
import java.lang.Math; interface Polygon { void getArea(); default void getPerimeter(int... sides) { int perimeter = 0; for (int side : sides) perimeter += side; System.out.println("Perimeter: " + perimeter); } } class Triangle implements Polygon { private final int a, b, c; private double area; Triangle(int a, int b, int c) { this.a = a; this.b = b; this.c = c; } @Override public void getArea() { double s = (a + b + c) / 2.0; area = Math.sqrt(s * (s - a) * (s - b) * (s - c)); System.out.println("Area: " + area); } } class Main { public static void main(String[] args) { Triangle t = new Triangle(2, 3, 4); t.getArea(); t.getPerimeter(2, 3, 4); } }
出力:
Area: 2.9047375096555625 Perimeter: 9
この例では、Polygonインターフェースが再利用可能なgetPerimeterメソッドを提供し、各図形が独自の面積計算を実装しています。
Java
- C#インターフェイスをマスターする:定義、実装、実践的なユースケース
- C#のインターフェース:堅牢なオブジェクト指向設計のための契約定義
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Java NavigableSetインターフェースをマスター:ナビゲーション、ソート、実践例
- Javaラムダ式完全ガイド:基礎からStream APIまで
- Java インターフェース vs 抽象クラス:適切な抽象化の選び方
- Javaインターフェース完全ガイド: 定義・実装・多重継承・タグインターフェース
- Java 9プライベートインターフェースメソッド:カプセル化とコード再利用を強化