web-dev-qa-db-ja.com

内部クラスの目的は何ですか

Javaの内部クラスの概念を確認しています。これまでのところ私が理解し、適用したものからJava内部クラスには、その外部/包含クラスのメソッドおよびフィールドへのリンクまたはアクセスがあります。

私の質問:

  1. いつ内部クラスを作成または定義する必要がありますか?
  2. 内部クラスは「ヘルパークラス」と呼ばれると見なされますか?
  3. 内部クラスを作成するための指標は何ですか?また、他の目的は何ですか?
44
user962206

内部クラスは、1箇所で使用されるクラスを論理的にグループ化する目的に最適です。たとえば、クラスを囲むだけで使用されるクラスを作成する場合、そのための別のファイルを作成することは意味がありません。代わりに、「内部クラス」として追加できます

Javaチュートリアル

ネストされたクラスを使用する理由は次のとおりです。

  • これは、1つの場所でのみ使用されるクラスを論理的にグループ化する方法です。
  • カプセル化が増加します。
  • より読みやすく保守しやすいコードにつながる可能性があります。
41
kosa

内部クラスの古典的な使用法は、コンテナ内のイテレータの実装です( ArrayList 、たとえば-class Itrを探します)。コンテナが他の世界に公開したいものはすべてIteratorです。ただし、コンテナの内部に精通しているイテレータの具体的な実装を作成する必要があります。内部クラスを使用すると、実装が非表示になりますが、コンテナーの実装の近くに保持されます。また、内部(非静的)であるため、そのコンテナの特定のインスタンスにバインドされ、プライベートコンテナメンバーにアクセスできます。

内部クラスのいくつかのタイプ -非静的なネストされたクラス、ローカルクラス、および匿名クラスがあります。それぞれの目的は多少異なるため、内部クラスについて尋ねるときは、どの種類のことを話しているのかを指定する必要があります。

非静的内部クラスを参照していると仮定すると、それらを使用する理由は通常のクラスを使用することと同じだと思います(つまり、抽象化とコードの論理ユニットへの分割)が、このクラスの使用を可視化する理由はありません他の世界へ。もちろん、ネストされたクラスをパブリックにすることもできます。その場合、外部クラスとの密接な関係を表現するために、独立ではなくネストされたクラスを作成します。

14
eran
  1. 主な理由については Javaチュートリアル をご覧ください。

  2. 「ヘルパークラス」によって、内部でのみ使用するものを意味する場合、そうではなく、必ずしもそうではありません。あなたは次のようなことをしたいかもしれません

    class Outer {
        private static class Inner implements InterestingInterface {
            // whatever
        }
        public InterestingInterface make_something_interesting() {
            return new Inner();
        }
    }
    

    ここで、Innerは、外部の世界がそのインスタンスを見るという意味で「ヘルパークラス」ではありませんが、その実装は完全に隠されています。外部の世界は、InterestingInterface

4
Fred Foo

内部クラスの目的の1つは、リスナーをアタッチすることです。たとえば、JMenuItemがあるとします。次のコードに示すように、アプリを終了させることができます。

JMenuItem quitItem = new JMenuItem("Quit");
quitItem.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e)
    {
        //cleanup code before exiting
        System.exit(0);
    }
});

また、クラスが外部クラス状態変数にアクセスできるようにしたい場合がありますが、これはそのクラスに完全に従属しています。たとえば、簡単な色の計算機を書くことを検討してください。 16進コードを入力するテキスト領域がある場合があります。 Enterキーを押すと、JPanelに色が表示されます。ここにあなたがするかもしれないことの大まかな概要があります。

public class ColorCalc extends JPanel implements Runnable
{
    Color displayedColor;
    JTextArea colorEnterArea;
    public ColorCalc()
    {
        displayedColor = Color.white
        colorEnterArea = new JTextArea();
    }
    public void run()
    {
        //build GUI here
    }
    public static void main(String[] args)
    {
         ColorCalc cc = new ColorCalc();
         javax.swing.SwingUtilities.invokeLater(cc);
    }
    //subservient inner class with access to outer class state variable.
    class ColorPanel extends JPanel
    {
         public void paintComponent(Graphics g)
         {
             g.setColor(displayedColor);
             g.fillRect(0,0,getWidth(), getHeight());
         } 
    }

}
3
ncmathsadist

一般的な規則として、objectsdesignedfor single責務(Highlycohesive)。言い換えれば、適切に設計されたオブジェクトは、単一コヒーレントタスクを実行する必要があります。これは、オブジェクト指向設計のベストプラクティスと見なされます。

ただし、開発者は、動作するためにseparatespecializedクラスを必要とするクラスを設計する場合があります。この別個のspecializedクラスは、ヘルパークラスと見なすことができます。

helperクラスが他のクラスで使用されていないである場合、prime候補と見なされます- 内部クラス

上記のncmathsadistによって引き出されるように、内部クラスの使用のexampleEvent handlersの実装にあります。

たとえば、グラフィカルユーザーインターフェイス(GUI)の設計では、開発者がbutton thatperformsaparticularを作成した可能性がありますtaskユーザーが押した後。

ボタンには、イベントハンドラ whichlistensが必要で、その特定のボタンが押されたときを示します。

この場合、ボタンのイベントハンドラーを内部クラスとして作成すると、ベストプラクティスになります。内部クラスは、 GUIクラス内の特定のボタン

3
Mark Burleigh

クラスがフィールドとメソッドで統計と動作を指定するように提供し、このクラスを囲んでいるクラスの外で使用する必要がないので、クラスによって十分に実行できるコードがあることがわかった場合。内部クラスを使用する必要があります。

ここで、内部クラスは外部の世界から隠されています。内部クラスは、カプセル化を提供する包含クラスのプライベートメンバーにアクセスできます。

例を挙げましょう。ギアをサイクルに設定し、最大6つのギアしかないというビジネスルールがあるとします。そのため、ギアを設定するメソッドを持つ内部クラスサイクルを作成できます。その方法には、サイクルを実行しているように、ギアを設定する前にチェックされるいくつかの検証があります...ギア数は6未満です...

最良の例は、イベント処理コードが内部クラス(場合によっては匿名内部クラス)を使用して、イベント用に別個のイベントオブジェクトクラスとイベントリスナークラスを作成せずにイベントとリスナーを作成することです。

2
027

これはスタイルの質問です。内部クラスで実行できることはすべて、一連の外部クラスとして実行することもできます。内部クラスは、軽量であるか、囲んでいるクラスに緊密にバインドされているクラスに特に役立ちます。たとえば、コンパレータはしばしばこれらの両方です。クラスの実装に関する詳細な知識が必要であり、数行の長さしかありません。内部クラスとしては理想的な候補者かもしれません。

1
Spina

たとえば、クラスBがあり、このクラスがクラスAでのみ使用される場合、クラスロジックをグループ化するために使用される内部クラスあなたのコード。

ハッピーコード:)

0
Mohamed Ali