2009-06-09 9 views
5

クラスのフィールドが決してnullに設定されないように、きれいで安全な方法を探しています。フィールドの値をクラスコンストラクタで一度設定し、後で変更しないことをお勧めします。私は彼がC#のreadonlyキーワードはこれを可能にすると思います。 Javaで同じことをする方法はありますか?Javaクラスでフィールドがnullにならないようにする方法

class foo 
{ 

    private Object bar; 

    public foo(Object pBar) 
    { 
    if(pBar == null) 
    { 
     bar = new Object(); 
    } 
    else 
    { 
     bar = pBar 
    } 
    } 

    // I DO NOT WANT ANYONE TO MODIFY THE VALUE OF bar OUT OF THE CONSTRUCTOR 

} 

答えて

16

このようなfinal、ことbarを宣言します。あなたは、キーワードの最終探している

private final Object bar; 
7

class foo 
{ 
    private final Object bar; 

    public foo(Object pBar) 
    { 
     //Error check so that pBar is not null 
     //If it's not, set bar to pBar 
     bar = pBar; 
    } 
} 

今バーを変更することはできません

6

どちらも以前の答えが正しいですが、PBARがまだnullに設定することができます

new foo(null); 

だから、究極の答えは最終的に使用することですpBarがnullでないことを確認してください(前と同様)。

public class Foo 
{ 
    private final Object bar; 

    public Foo(Object pBar) 
    { 
     if (pBar == null) 
     { 
      bar = new Object(); 
     }else{ 
      bar = pBar; 
     } 
    } 
} 
+1

+1しかし、新しいObject()をサイレントに割り当てるのではなく、例外をスローするか、アサートを使用する方が良いと思います。 –

1

フィールドをfinalと宣言したいとします。 。

private final Object foo; 

これは、w.r.t.並行性は、コンストラクタの終了後にフィールドが初期化されることが保証されます。

これは、オブジェクトを別のオブジェクトに置き換えることができないことに注意してください。 オブジェクトのメソッドによってオブジェクトへの変更を防ぐことはできません。 setter、C/C++のconstとは異なります。