2016-11-22 7 views
2

データフィールドが可変データ型への参照ではなくても、最終(不変)Javaクラスのデータフィールドにパブリックアクセス修飾子を持つことをお勧めしますか?データフィールドはコンストラクタ自体で定義されるはずであるため、クラスの内部表現を変更する可能性はすべて無くなります。 お勧めしますか?例えば不変クラスで使用されるJavaのアクセス修飾子

public class MainApp { 

    public static void main(String args[]) { 

     Immutablesample immutablesample = Immutablesample.getInstance("akkhil"); 

     System.out.println(" Before modification " + immutablesample.getName()); 
     immutablesample.name = "gupta"; 
     System.out.println(" After modification " + immutablesample.getName()); 
    } 

} 

は、次のクラスのために(アクセス修飾子なしで)直接アクセスしてデータフィールドを変更しようと、呼び出し元のコードです:

public final class Immutablesample { 


    private final String name; 

    private Immutablesample(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return name; 
    } 

    public static Immutablesample getInstance(String name){ 
     return new Immutablesample(name); 
    } 
} 

それはどのようになるだろう私が変更をプライベートからパブリックに変更すると、内部表現が変更される傾向があります。 プライベートString name;パブリックString nameに; オブジェクトがパラメータ化されたコンストラクタを使用して作成されたため、不変のデータフィールドがあるため、なぜデータフィールドをプライベートにする必要があるのですか?

+1

例を1つまたは2つ投稿できますか?句読点や適切な用語を使用していないため、この質問を理解することが難しくなります。 –

+0

すべての詳細はここにあります。https://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html – grsdev7

+0

No.データフィールドは常にプライベートで最終的なものでなければなりません。 getterのみを提供します(必要に応じて変更可能なインスタンスの守備的なコピーを返すことができます) – TheLostMind

答えて

2

フォローする2つの単純なルール:

  1. をすることができますように、「不変」としてあなたの全体のクラスを作るにしてください。たとえば、プライベート最終フィールドはコンストラクタを介してのみ設定します。また、「受信」コレクションオブジェクトを使用する場合は、コピーというコンテンツを実際に安全な側に作成することを検討してください。
  2. 良いOOは露出に関するものですの動作;暴露についてではないデータ。意味:あなたは絶対にをしないでください。は本当に良い理由がない限り、フィールドを公開したいと考えています。言い換えれば:ではないは、クラスAのいくつかのフィールドの内容のために、他のいくつかのクラスBが何かをしたがっています。そして、それを防ぐ方法:フィールドをプライベートにする!
1

一般的に、クラスの内部表現を表示するのは悪い決定なので、最終的な変更不可能なフィールドを隠しておくとはるかに優れています。クラスの場合は、タプルのようなもので、外部からすべてのメンバーが使用されるフィールドのみを表示することができます。

関連する問題