16

Java では、内部クラスを持つことができます。これに何か利点があるかどうか、デザインの観点から興味があります。

私の最初の考えでは、クラスを別のファイルにすることで、物事を再利用可能なモジュールに分離することがより明確になるということです。そうすることで、他のクラスがその他のクラスを使用したい場合、独自のインスタンスを作成することもできます。私には、内部クラスを回避することは、拡張性とコードの再利用のために優れた設計になる可能性があるように思えます。また、新しいプロジェクトに取り組んでいるとき、通常、クラスが再利用されるかどうかを判断するのは難しいです...別々のクラスが行く方法です。

私がこの質問をするのは、これらのプロジェクトがたくさんあるプロジェクトを引き継いだからです...前の開発者は単に怠け者だったか、IDE に慣れていなかったのではないかと思います。しかし、これらの内部クラスが持つ利点を見逃していないことを確認したいと思います。利点がある場合は、誰かが私に知らせてくれますか?そうすれば、以前の開発者がこれらの利点を利用していたかどうかを確認できます.

4

5 に答える 5

18

内部クラスは、包含クラスの外部で使用されない場合に適しています。これは、クラスの肥大化を抑える方法です。原則として、私がそれらを使用するのはその時だけです。

非静的内部クラスも、それを含むインスタンスのプライベート フィールドにアクセスできます。

于 2013-04-18T14:02:04.450 に答える
3

内部クラスは次の場合に役立ちます。

  1. 実装の詳細を非表示にします。

  2. プロジェクト ビューをより簡潔にして理解しやすくします。

  3. 関連するコードの論理グループを追加します。

于 2013-04-18T13:57:22.910 に答える
2

私の頭に浮かぶ内部クラスの 1 つの良い使用法は、イテレータの実装を に隠すjava.util.ArrayListprivate inner classesです。iterator()呼び出すかlistIterator()、リスト オブジェクトを使用しない限り、それらを作成することはできません。

このように、IteratorおよびのListIterator実装はArrayList、読みやすさを向上させるために関連するクラスおよびメソッドとグループ化されますが (実装はかなり短い)、他のものからは隠されています。

static囲んでいるインスタンスオブジェクトにアクセスする必要があるため、宣言することはできません。

public class ArrayList<E> extends AbstractList<E>
         implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    ...
    public Iterator<E> iterator() {
         return new Itr();
    }

    private class Itr implements Iterator<E> {
    ...
    }

    public ListIterator<E> listIterator() {
         return new ListItr(0);
    }

    private class ListItr extends Itr implements ListIterator<E> {
    ...
    }
}
于 2013-04-18T14:01:55.523 に答える