2012-04-12 91 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)来代替。 – 2012-04-12 17:52:34

+0

只是不公开修饰符方法(即没有'set'方法)。 – twain249 2012-04-12 17:54:02

回答

3

只需标记您的类的所有领域final,不随地分配给他们,但你的类的构造函数。

+0

最好,这些字段也应该是private,但OP示例中的所有字段都是不可变的类型。 – 2012-04-12 17:55:35

+0

是的,字段应该是“私人”或者它们是不可变的对象,“最终”。 – trutheality 2012-04-12 18:00:07

2

此外,最好让类最终,或只提供私有构造函数和静态工厂方法。这意味着人们不能继承你的课程并覆盖你的方法。

例如:

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%不变。但请解释什么静态工厂方法创建在这里做.. !! – user1320527 2012-04-13 02:20:55