static ネストクラス
外部クラスのインスタンス参照を持たない、関連するヘルパー型として static ネストクラスを定義します。
「static ネストクラス」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
staticネストクラス
staticネストクラスは、別のクラスの内部でstaticキーワードを使って定義されます。外側のクラスのインスタンスへの参照を持たず、外側のクラスと論理的にまとめられているだけです。
staticネストクラスの宣言
外部からネストクラスにアクセスするには、外側のクラス名を使用します。
class LinkedList<T> {
private Node<T> head;
// Static nested class — no outer instance reference
private static class Node<T> {
T data;
Node<T> next;
Node(T data) { this.data = data; }
}
public void addFirst(T item) {
Node<T> node = new Node<>(item);
node.next = head;
head = node;
}
}外部からのアクセス
publicなstaticネストクラスは、OuterClass.InnerClassとして参照します。
class Builder {
public static class Config {
public final String host;
public final int port;
Config(String host, int port) {
this.host = host; this.port = port;
}
}
}
Builder.Config config = new Builder.Config("localhost", 8080);
System.out.println(config.host + ":" + config.port); // localhost:8080staticネストクラスと内部クラス
重要な違いは、staticネストクラスには外側のインスタンスへの暗黙的な参照がないことです。一方、内部クラス(non-staticクラス)にはそのような参照があります。
class Outer {
private int x = 10;
// Static nested: no access to x
static class StaticNested {
void doSomething() {
// System.out.println(x); // compile error — no outer reference!
System.out.println("Static nested");
}
}
// Inner class: has access to x
class Inner {
void doSomething() {
System.out.println(x); // 10 — can access outer fields
}
}
}staticネストクラスによるBuilderパターン
一般的なBuilderパターンでは、呼び出し側がBuilderを作成するために外側のインスタンスを必要としないよう、staticネストクラスを使用します。
class Pizza {
private final String size, crust;
private final List<String> toppings;
private Pizza(Builder b) {
this.size = b.size; this.crust = b.crust; this.toppings = List.copyOf(b.toppings);
}
public static class Builder {
private String size = "medium", crust = "thin";
private List<String> toppings = new ArrayList<>();
public Builder size(String s) { this.size = s; return this; }
public Builder crust(String c) { this.crust = c; return this; }
public Builder topping(String t) { this.toppings.add(t); return this; }
public Pizza build() { return new Pizza(this); }
}
}Mapのエントリ
Map.Entryは、キーと値のペアを反復処理するために使われる、よく知られたstaticネストインターフェースです。
import java.util.*;
Map<String, Integer> scores = Map.of("Alice", 95, "Bob", 87, "Carol", 92);
for (Map.Entry<String, Integer> entry : scores.entrySet()) {
System.out.printf("%-10s: %d%n", entry.getKey(), entry.getValue());
}
// Modern: using var
for (var entry : scores.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}staticネストクラスを使ったテスト
単体テストでは、staticネストクラスにテストフィクスチャやモック実装を保持させ、テストクラスのスコープに限定できます。
class UserServiceTest {
// Static nested fake/stub — no outer instance needed
static class FakeUserRepository implements UserRepository {
private final Map<Long, User> store = new HashMap<>();
public void save(User u) { store.put(u.id(), u); }
public Optional<User> findById(long id) {
return Optional.ofNullable(store.get(id));
}
}
// @Test methods use FakeUserRepository
void testFindUser() {
FakeUserRepository repo = new FakeUserRepository();
// ...
}
}ドメインロジックのstaticネストクラス
ドメインモデルを整理しやすくするために、関連する型をstaticネストクラスでまとめます。
class Order {
private final long id;
private final List<LineItem> items;
// Static nested — logically belongs to Order, no outer reference needed
public static class LineItem {
public final String sku;
public final int quantity;
public final double unitPrice;
public LineItem(String sku, int qty, double price) {
this.sku = sku; this.quantity = qty; this.unitPrice = price;
}
public double total() { return quantity * unitPrice; }
}
// ...
}比較:staticネストクラスとトップレベルクラス
クラスが外側のクラスのコンテキストでのみ使用される場合は、staticネストクラスを優先します。より広い用途がある場合は、トップレベルクラスを使用します。
ジェネリクスとstaticネストクラス
staticネストクラスは、トップレベルクラスと同じようにジェネリクスを使用できます。
class Pair<A, B> {
// Static nested with its own type params
public static class Mutable<X, Y> {
public X first;
public Y second;
public Mutable(X first, Y second) {
this.first = first; this.second = second;
}
}
public static <X, Y> Mutable<X, Y> mutableOf(X x, Y y) {
return new Mutable<>(x, y);
}
}
Pair.Mutable<String, Integer> p = Pair.mutableOf("Alice", 30);
System.out.println(p.first + " is " + p.second); // Alice is 30メモリ効率
staticネストクラスは外側のインスタンスへの参照を保持しません。そのため、長期間存続する構造で外側のオブジェクトを誤ってメモリに保持し、メモリリークを引き起こすことを避けられます。
理解度チェック
staticネストクラスと内部(non-static)クラスの違いは何ですか?
まとめ:staticネストクラス
重要なポイント:
- staticネストクラスは外側のクラスとまとめられますが、外側のインスタンスへの参照を持ちません
- 外部からはOuterClass.NestedClassとしてアクセスします
- 暗黙的な参照がないため、外側のインスタンスを誤って保持することがありません
- Builderパターンでは、staticネストのBuilderクラスがよく使われます
- Map.Entryは、よく知られたstaticネストインターフェースです
- 内部クラスから外側のインスタンスにアクセスする必要がない場合は、staticネストクラスを優先します
よくある質問
「static ネストクラス」レッスンは無料ですか?
はい。「static ネストクラス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「static ネストクラス」で何を学びますか?
外部クラスのインスタンス参照を持たない、関連するヘルパー型として static ネストクラスを定義します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「static ネストクラス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- static ネストクラス
- 内部クラスと外部クラスへのアクセス
- ローカルクラスと匿名クラス
- 適切なネスト方法の選択