71

たとえば、その機能の一部を実行するヘルパー クラスと一緒にクラスがある場合、それを内部クラスとして作成することは理にかなっていますか。

    public class Foo {
       private FooHelper helper;

       // constructor & any other logic

       public void doSomeThing() {
         helper.do();
       }
    }

    public class FooHelper {
        public void do() {
         // code
        }
    }

FooHelper上記の場合、 を内部クラスにするのは理にかなっていますか? これがばかげているように聞こえる場合はお詫びしますが、ユースケースについて少し混乱しています。

4

10 に答える 10

82

Yes, it makes perfect sense to make it an inner class. If no other classes need it, make it private. If it doesn't require exclusive access to the members of the outer class, make it a static nested class because then it will require less memory space.

Check out the recommendation from the official tutorial -

Use a non-static nested class (or inner class) if you require access to an enclosing instance's non-public fields and methods. Use a static nested class if you don't require this access.

于 2013-08-23T06:17:51.170 に答える
17

以外のクラスではまったく役に立たないと思われる場合はFooHelper、の内部クラスにするのが理にかなっています。この種の設計の一例は、プライベート内部クラスを定義する場所で見つけることができますFooprivate FooHashMapKeySet

それ以外の場合は、インスタンスとして持っているとprivate見栄えがします。

于 2013-08-23T06:21:01.730 に答える
2

内部クラスは、それらが小さく、名前を必要としない場合に意味があります。GUI のリスナーは、意味のある古典的な例です。

クラスが大きく重要な場合は、名前を付けて別のファイルに配置する必要があります。

通常の GUI の例のリスナー クラスは、1 つの小さなことを行います。通常は、実際の作業を行うために他の関数にディスパッチするだけです。

また、別のクラスのコンテキストでのみ使用されるクラスに静的なネストされたクラス (技術的には内部クラスではない) をよく使用します - Map.Entryはこの良い例です。Map と組み合わせてのみ使用されるため、Entry の定義を Map インターフェースの一部にすることは、組織的に理にかなっています。

通常、非静的メンバー クラスやローカル クラスなど、他の種類の入れ子になったクラスはあまり使用しません。しかし、それらは時々役に立ちます。メンバー クラスの正当な使用例については、LinkedList.ListItr のソース コードを参照してください。これは、 LinkedListListIteratorの実装を提供することを目的とするプライベート内部クラスです。これを行うには、LinkedList 内のプライベート データにアクセスできると便利です。トップレベルのクラスのみを使用してこれを実現するには、LinkedList でより多くのパブリック メソッドを公開して、ListIterator が LinkedList の基になる実装を取得できるようにする必要がありました。代わりに、内部クラスを使用すると、本来あるべきように、LinkedList がその実装をプライベートに保つことができます。

于 2013-08-23T06:23:13.633 に答える
1

はい、内部クラスを使用する利点は、外部クラスのメンバーにアクセスできることです。あなたの場合、FooHelper他のクラスで使用されないと思われる場合は、内部クラスにすることができます。

内部クラスの有用性を確認するには、AWT の例を調べてください。匿名の内部クラスは、イベント ハンドラーで広く使用されています。

于 2013-08-23T06:23:41.180 に答える
0

ネストされたクラスを使用すると、1 つの場所でのみ使用されるクラスを論理的にグループ化し、カプセル化の使用を増やし、より読みやすく保守しやすいコードを作成できます。ローカル クラス、匿名クラス。

http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html

于 2015-03-10T19:40:38.143 に答える