1. ホーム

[解決済み】Javaで静的ネストされたクラス、なぜ?

2022-04-06 14:34:10

質問

のJavaコードを見ていたら LinkedList で、静的なネストされたクラスが使われていることに気づきました。 Entry .

public class LinkedList<E> ... {
...

 private static class Entry<E> { ... }

}

通常のインナークラスではなく、静的なネストクラスを使用する理由は何でしょうか?

私が思いついた唯一の理由は、Entryはインスタンス変数にアクセスできないので、OOPの観点から見て、より良いカプセル化ができるということでした。

でも、他にも理由があるんじゃないかと思ったんです、パフォーマンスとか。それは何でしょうか?

注 私の用語が正しいことを願います。私はこれを静的インナークラスと呼びますが、これは間違いだと思います。 http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html

解決方法は?

リンク先のSunのページには、両者の主な相違点が書かれています。

<ブロッククオート

ネストされたクラスは、それを囲むクラスのメンバである。非静的ネストクラス(インナークラス)は、たとえプライベートと宣言されていても、エン クロージングクラスの他のメンバにアクセスすることができます。静的なネストされたクラスは、包含するクラスの他のメンバにアクセスすることはできません。

...

注:静的ネストされたクラスは、他のトップレベルクラスと同様に、その外側のクラス(および他のクラス)のインスタンスメンバーと対話することができます。 事実上、静的ネストされたクラスは、パッケージングの都合上、他のトップレベルクラスの中にネストされたトップレベルクラスという振る舞いになります。

は必要ありません。 LinkedList.Entry をそのままトップレベルクラスとする のみ で使用される LinkedList (という名前の静的ネストされたクラスを持つ他のインターフェースもあります)。 Entry などのように Map.Entry - と同じ概念です)。そして、LinkedListのメンバーにアクセスする必要がないので、静的であることは理にかなっており、よりクリーンなアプローチと言えます。

として Jon Skeetが指摘する ネストされたクラスを使用する場合、最初は静的で、その後、使用状況に応じて非静的である必要があるかどうかを決定するのがより良いアイデアだと思います。