日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

关于java中的不可变类(转)

發(fā)布時(shí)間:2025/6/17 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于java中的不可变类(转) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

如何在Java中寫出Immutable的類?

要寫出這樣的類,需要遵循以下幾個(gè)原則:

1)immutable對(duì)象的狀態(tài)在創(chuàng)建之后就不能發(fā)生改變,任何對(duì)它的改變都應(yīng)該產(chǎn)生一個(gè)新的對(duì)象。

2)Immutable類的所有的屬性都應(yīng)該是final的。

3)對(duì)象必須被正確的創(chuàng)建,比如:對(duì)象引用在對(duì)象創(chuàng)建過(guò)程中不能泄露(leak)。

4)對(duì)象應(yīng)該是final的,以此來(lái)限制子類繼承父類,以避免子類改變了父類的immutable特性。

5)如果類中包含mutable類對(duì)象,那么返回給客戶端的時(shí)候,返回該對(duì)象的一個(gè)拷貝,而不是該對(duì)象本身(該條可以歸為第一條中的一個(gè)特例)

當(dāng)然不完全遵守上面的原則也能夠創(chuàng)建immutable的類,比如String的hashcode就不是final的,但它能保證每次調(diào)用它的值都是一致的,無(wú)論你多少次計(jì)算這個(gè)值,它都是一致的,因?yàn)檫@些值的是通過(guò)計(jì)算final的屬性得來(lái)的!

下面是一個(gè)例子:

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;} }

我們?yōu)轭愄砑恿薴inal修飾,從而避免因?yàn)槔^承和多態(tài)引起的immutable風(fēng)險(xiǎn)。

上面是最簡(jiǎn)單的一種實(shí)現(xiàn)immutable類的方式,可以看到它的所有屬性都是final的。

有時(shí)候你要實(shí)現(xiàn)的immutable類中可能包含mutable的類,比如java.util.Date,盡管你將其設(shè)置成了final的,但是它的值還是可以被修改的,為了避免這個(gè)問(wèn)題,我們建議返回給用戶該對(duì)象的一個(gè)拷貝,這也是Java的最佳實(shí)踐之一。下面是一個(gè)創(chuàng)建包含mutable類對(duì)象的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屬性的一個(gè)拷貝,這樣的話如果別人通過(guò)getRemindingDate()方法獲得了一個(gè)Date對(duì)象,然后修改了這個(gè)Date對(duì)象的值,那么這個(gè)值的修改將不會(huì)導(dǎo)致ImmutableReminder類對(duì)象中remindingDate值的修改。

使用Immutable類的好處:
1)Immutable對(duì)象是線程安全的,可以不用被synchronize就在并發(fā)環(huán)境中共享

2)Immutable對(duì)象簡(jiǎn)化了程序開(kāi)發(fā),因?yàn)樗鼰o(wú)需使用額外的鎖機(jī)制就可以在線程間共享

3)Immutable對(duì)象提高了程序的性能,因?yàn)樗鼫p少了synchroinzed的使用

4)Immutable對(duì)象是可以被重復(fù)使用的,你可以將它們緩存起來(lái)重復(fù)使用,就像字符串字面量和整型數(shù)字一樣。你可以使用靜態(tài)工廠方法來(lái)提供類似于valueOf()這樣的方法,它可以從緩存中返回一個(gè)已經(jīng)存在的Immutable對(duì)象,而不是重新創(chuàng)建一個(gè)。

?

immutable也有一個(gè)缺點(diǎn)就是會(huì)制造大量垃圾,由于他們不能被重用而且對(duì)于它們的使用就是”用“然后”扔“,字符串就是一個(gè)典型的例子,它會(huì)創(chuàng)造很多的垃圾,給垃圾收集帶來(lái)很大的麻煩。當(dāng)然這只是個(gè)極端的例子,合理的使用immutable對(duì)象會(huì)創(chuàng)造很大的價(jià)值。

?

轉(zhuǎn)載于:https://www.cnblogs.com/gdjdsjh/p/5111083.html

總結(jié)

以上是生活随笔為你收集整理的关于java中的不可变类(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。