Javaの各種入れ子クラス
Javaには、クラスの中にクラスを定義する「入れ子クラス」があります。この機能は、関連するクラスをまとめたり、クラス設計をより柔軟にするために使用されます。以下に、Javaで利用可能な各種入れ子クラスの種類とその用途を、例を交えて詳しく解説します。
内部クラス (Inner Class)
内部クラスは、外部クラスの内部に定義されるクラスで、外部クラスのメンバーに直接アクセスできます。内部クラスは、論理的に外部クラスと密接に関連するクラスをカプセル化するために使用されます。
例: 内部クラスの基本
public class OuterClass {
private String outerField = "Outer Field";
public class InnerClass {
public void printOuterField() {
System.out.println("Accessing: " + outerField);
}
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
InnerClass inner = outer.new InnerClass();
inner.printOuterField();
}
}
このコードでは、内部クラス InnerClass
が外部クラス OuterClass
のメンバー変数 outerField
に直接アクセスしています。
メソッドローカルクラス (Method-Local Class)
メソッドローカルクラスは、メソッドの内部に定義されるクラスです。メソッドのロジックに密接に関連する場合に使用され、スコープはメソッド内に限定されます。
例: メソッドローカルクラスの利用
public class OuterClass {
public void printMessage() {
class MethodLocalClass {
void display() {
System.out.println("This is a Method-Local Class");
}
}
MethodLocalClass localClass = new MethodLocalClass();
localClass.display();
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.printMessage();
}
}
このコードでは、MethodLocalClass
が printMessage
メソッド内で定義され、ローカル変数として使用されています。
静的ネストクラス (Static Nested Class)
静的ネストクラスは、静的に宣言されたネストクラスです。外部クラスのインスタンスに依存せず、外部クラスの静的メンバーにのみアクセスできます。
例: 静的ネストクラスの利用
public class OuterClass {
private static String staticField = "Static Field";
public static class StaticNestedClass {
public void display() {
System.out.println("Accessing: " + staticField);
}
}
public static void main(String[] args) {
StaticNestedClass nested = new StaticNestedClass();
nested.display();
}
}
このコードでは、StaticNestedClass
が外部クラスの静的メンバー staticField
にアクセスしています。
匿名クラス (Anonymous Class)
匿名クラスは、名前を持たない一時的なクラスです。主にインターフェースや抽象クラスを実装する場合に使用されます。
例: 匿名クラスの利用
public class OuterClass {
public void executeAction() {
Runnable action = new Runnable() {
@Override
public void run() {
System.out.println("This is an Anonymous Class");
}
};
action.run();
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.executeAction();
}
}
このコードでは、Runnable
インターフェースを匿名クラスとして実装しています。
入れ子クラスの主な用途
- 内包されたロジックを分離して可読性を向上させる。
- 外部クラスと密接に関連する補助的なクラスを定義する。
- メソッド内のロジックに限定されたクラスを作成する。
- 一時的なインターフェース実装やクラス拡張を簡素化する。
まとめ
Javaの入れ子クラスは、コードの構造化やカプセル化に役立つ強力なツールです。それぞれのクラスには特定の用途とスコープがあり、適切な場面で活用することでコードの保守性と再利用性を向上させることができます。