2012-04-12 12 views
-3

以下のクラスを不変にしたいと考えています。誰でもJavaで不変クラスを作成する簡単な例を提供できますか?不変クラスを作成する方法

class Emp implements Comparable 
{ 
     String name,job; 
     int salary; 
     public Emp(String n,String j,int sal) 
     { 
     name=n; 
     job=j; 
     salary=sal; 
     } 
     public void display() 
     { 
     System.out.println(name+"\t"+job+"\t"+salary); 
     } 
    public boolean equals(Object o) 
     { 

     // use a shortcut comparison for slightly better performance; not really required 
      if (this == o) 
      { 
       return true; 
      } 
      // make sure o can be cast to this class 
      if (o == null || o.getClass() != getClass()) 
      { 
       // cannot cast 
       return false; 
      }    
      // can now safely cast  
      Emp p=(Emp)o; 
      return this.name.equals(p.name)&&this.job.equals(p.job) &&this.salary==p.salary; 
     } 
     public int hashCode() 
     { 
      return name.hashCode()+job.hashCode()+salary; 
     } 


     public int compareTo(Object o) 
     { 
      Emp e=(Emp)o; 
      return this.name.compareTo(e.name); 
      //return this.job.compareTo(e.job); 
     // return this.salary-e.salary; 

     } 
} 
+2

たぶんあなたの代わりに[不変オブジェクトでこの記事](http://www.javapractices.com/topic/TopicAction.do?Id=29)をお読みください。 –

+0

はpublic修飾子メソッドを作成しません(つまり 'set'メソッドはありません)。 – twain249

答えて

3

ちょうどfinalとしてあなたのクラスのすべてのフィールドにラベルを付け、どこでもそれらに割り当てることはありませんが、あなたのクラスのコンストラクタ。

+0

フィールドは「private」であることが望ましいが、OPの例のフィールドはすべて不変型であることが望ましい。 –

+0

ええ、フィールドは 'private'か、不変オブジェクトであれば' final'でなければなりません。 – trutheality

2

また、クラスをfinalにするか、プライベートコンストラクタと静的ファクトリメソッドのみを用意するのが良い方法です。つまり、あなたのクラスをサブクラス化してメソッドをオーバーライドすることはできません。例えば

public class Immutable { 
    private final String value; 
    private Immutable(String value) { 
     this.value = value; 
    } 
    public static Immutable create(String value) { return new Immutable(value); } 
    public String getValue() { return value; } 
} 
+0

こんにちは、ありがとう、この例では、100%不変になる静的なファクトリメソッドを含む変更を使用してクラスをfinalとして宣言すると.. !!静的なファクトリメソッドがここで何をしているのかを説明してください.. !! – user1320527

関連する問題