Language 中級

staticネストクラスを使わずに内部クラスで静的メンバーを定義できる。

✕ Java 8
class Library {
    // Must be static nested class
    static class Book {
        static int globalBookCount;

        Book() {
            globalBookCount++;
        }
    }
}

// Usage
var book = new Library.Book();
✓ Java 16+
class Library {
    // Can be inner class with statics
    class Book {
        static int globalBookCount;

        Book() {
            Book.globalBookCount++;
        }
    }
}

// Usage
var lib = new Library();
var book = lib.new Book();
このコードに問題がありますか? お知らせください。
🔓

柔軟性の向上

内部クラスでも必要に応じて静的メンバーを持てるようになりました。

🔗

共有状態

内部クラスのインスタンス間で共有状態を追跡できます。

🎨

設計の自由

静的フィールド1つのためだけにstaticネストクラスに昇格する必要がありません。

旧来のアプローチ
staticネストクラスの必須化
モダンなアプローチ
内部クラスの静的メンバー
JDKバージョン
16
難易度
中級
内部クラスの静的メンバー
利用可能

JDK 16(2021年3月)以降、広く利用可能

Java 16以前は、staticネストクラスだけが静的メンバーを持てました。内部(非static)クラスはエンクロージングインスタンスを必要とするため、staticを持てませんでした。Java 16でこの制限が緩和され、内部クラスでも静的フィールド、メソッド、さらにネスト型を使えるようになりました。

共有 𝕏 🦋 in