关于java中的不可变类(转)
如何在Java中寫出Immutable的類?
要寫出這樣的類,需要遵循以下幾個原則:
1)immutable對象的狀態在創建之后就不能發生改變,任何對它的改變都應該產生一個新的對象。
2)Immutable類的所有的屬性都應該是final的。
3)對象必須被正確的創建,比如:對象引用在對象創建過程中不能泄露(leak)。
4)對象應該是final的,以此來限制子類繼承父類,以避免子類改變了父類的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對象會創造很大的價值。
?
轉載于:https://www.cnblogs.com/gdjdsjh/p/5111083.html
總結
以上是生活随笔為你收集整理的关于java中的不可变类(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.2.5 NIO.2 Path 和 J
- 下一篇: GMM高斯混合模型学习笔记(EM算法求解