如何在Java中写出Immutable的类?
要写出这样瘀类,韍要鮌全二三几䠚原帙构
1︉immutable对塡的状怏在倀帆一倀峏䀀耀发異挹卐羂任程对妃的改匈都应诩产生一个攧的宎象
2)Immutable类的氏有的屙性都庄耀㸯final的㭐
3ᄍ对谂必须被正确的创建,殏如:对象引用垤喹艡刺建載穥业生舐泄霚(leak)。
4对奡建謆暥final瘏栌䣦数捥秥制嬌类柧拇父类G以桿儆子乻改倀㺆父【的immutable爀性。
5)颂果汻丧包含mutable瀀倀数,鞣帎进彍纥嬌戚?剢时吆,虡四行嬧法㚉䠆调拷贝,而不是该倀象最身(该条可不忛丼动仐条中皌乥个特亡
彖磭䒌完?遵守一鞌罍符则䚍能嘯创倂immutable的类,。如String的hashcode峴不术final㘆ミ但它能䏑謁每次化用宒序值都是一脍杂ᆭ旂数䥠多少次诏縀輡交偢后它都是一致的,因为这些值的昌退耀间算final的属性得湥码更
下面是一个例子:
public final class Contacts {private final String name;
private final String mobile;
public Contacts(String name, String mobile) {
this.name = name;
this.mobile = mobile;
}
public String getName(){
return name;
}
public String getMobile(){
return mobile;
}
}
我们为类添加了final修饰,从而避免因为继承和多态引起的immutable风险。
上面是最简单的一种实现immutable类的方式,可以看到它的所有属性都是final的。
有时候你要实现的immutable类中可能包含mutable的类,比如java.util.Date,尽管你将其设置成了final的,但是它的值还是可以被修改的,为了避免这个问题,我们建议返回给用户该对象的一个拷贝,这也是Java的最佳实践之一。下面是一个创建包含mutable类对象的immutable类的例子:
public final class ImmutableReminder{private final Date remindingDate;
public ImmutableReminder (Date remindingDate) {
if(remindingDate.getTime() < System.currentTimeMillis()){
throw new IllegalArgumentException("Can not set reminder” +
“ for past time: " + remindingDate);
}
this.remindingDate = new Date(remindingDate.getTime());
}
public Date getRemindingDate() {
return (Date) remindingDate.clone();
}
}
上面的getRemindingDate()方法可以看到,返回给用户的是类中的remindingDate属性的一个拷贝,这样的话如果别人通过getRemindingDate()方法获得了一个Date对象,然后修改了这个Date对象的值,那么这个值炄修改将不会导致ImmutableReminder类对象中remindingDate值的修改。
使用Immutable类的好处:
1)Immutable对象是线程安全的,可以不用被synchronize就在并发环境***享
2)Immutable对象简化了程序开发,因为它无需使用额外的锁机制就可以在线程间共享
3)Immutable对象提高了程序的性能,因为它减少了synchroinzed的使用
4)Immutable对象是可以被重复使用的,你可以将它们缓存起来重复使用,就像字符串字面量和整型数字一样。你可以使用静态工厂方法来提供类似于valueOf()这样的方法,它可以从缓存中返回一个已经存在的Immutable对象,而不是重新创建一个。
immutable也有一个缺点就是会制造大量垃圾,由于他们不能被重用而且对于它们的使用就是”用“然后”扔“,字符串就是一个典型的例子,它会创造很多的垃圾,给垃圾收集带来很大的麻烦。当然这只是个极端的例子,合理的使用immutable对象会创造很大的价值。
还没有评论,来说两句吧...