2013-03-03 9 views
9

静的にネストされたプライベートクラスをJavaで使用している場合は、直接フィールドアクセスではなくゲッターとセッターを使用することをお勧めしますか?プライベート静的内部クラスにはカプセル化が推奨されていますか?

例。直接のフィールドアクセス:カプセル化対

public class Application { 
    private List<MyInnerClass> myInnerClassList; 

    // ... 

    public void foo() { 
     MyInnerClass inner = new MyInnerClass(); 
     inner.bar = 50; 
     myInnerClassList.add(inner); 
    } 

    private static class MyInnerClass { 
     private int bar; 
    } 
} 

public class Application { 
    private List<MyInnerClass> myInnerClassList; 

    // ... 

    public void foo() { 
     MyInnerClass inner = new MyInnerClass(); 
     inner.setBar(50); 
     myInnerClassList.add(inner); 
    } 

    private static class MyInnerClass { 
     private int bar; 

     public int getBar() { 
      return bar; 
     } 

     public void setBar(int bar) { 
      this.bar = bar; 
     } 
    } 
} 
+0

カプセル化は通常、クラスを独立させておく(たとえば、 'bar'の割り当て方法を変更したい場合など)。しかし、あなたが 'MyInnerClass'で何をしたいかによっても変わります。 – m0skit0

+1

他の誰もそれを含む外部クラスよりもその内部クラスにアクセスできない場合は、getterとsetterを使用する必要が生じた場合、それをリファクタリングするのは比較的簡単です。だから私は単純な変数を使用します。 –

答えて

2

だが一般的には大丈夫だと思います。 ゲッターとセッターを使用する主な理由の1つは、クラスのユーザーから実装の詳細を隠すことで、ユーザーに影響を与えずに実装を簡単に変更できることです。

プライベート内部クラスの場合は、クラスの作成者とユーザーの両方であり、外部の誰も使用できないため、これは問題にはなりません。

いくつかのデータをまとめて保持するだけであれば、ゲッタとセッタを持たないと、コードが短くて読みやすくなります。

しかし、内部クラスが大きくて複雑な場合(通常はそうではない)、getters/setterの使用を検討する必要があります。これにより、たとえばコード内でbarに境界チェックを追加することができます。

0

いくつかの点で、それは外のクラスをリファクタリングして移動するために意味をなす可能性があるため、これは、推奨されます。また、そのためのインターフェースを作ることなどが望まれるかもしれません。多分もっと多くの理由があります。

+4

移動した時点でゲッタとセッタを追加できます。 – Eric

0

Javaチュートリアル:「静的なネストされたクラスは、他のトップレベルクラスと同様に、その外部クラス(およびほかのクラス)のインスタンスメンバーとやりとりします。パッケージングの利便性のために別のトップレベルクラスにネストされたクラス "

だから、はい、あなたは、トップレベルのクラスの場合と同じようにメンバーをカプセル化したいと思います。

+2

ここで重要な点は、クラスがプライベートなので、トップレベルクラスのように扱うべきではないということです。 – Eric

関連する問題