内部クラスの静的メンバー
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サポート
内部クラスの静的メンバー
利用可能
JDK 16(2021年3月)以降、広く利用可能
仕組み
Java 16以前は、staticネストクラスだけが静的メンバーを持てました。内部(非static)クラスはエンクロージングインスタンスを必要とするため、staticを持てませんでした。Java 16でこの制限が緩和され、内部クラスでも静的フィールド、メソッド、さらにネスト型を使えるようになりました。
関連ドキュメント