国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Effective Java 之個人總結(jié)

maxmin / 390人閱讀

摘要:模式下使用來設(shè)置各個參數(shù),無法僅通過檢驗構(gòu)造器參數(shù)的有效性來保證一致性,會試圖使用不一致狀態(tài)的對象。消除過期的對象引用緩存時優(yōu)先使用,這些數(shù)據(jù)結(jié)構(gòu),及時清掉沒用的項。顯示取消監(jiān)聽器和回調(diào),或進(jìn)行弱引用。

創(chuàng)建和銷毀對象
1、靜態(tài)工廠方法代替構(gòu)造器

靜態(tài)工廠方法有名稱,能確切地描述正被返回的對象。

不必每次調(diào)用都創(chuàng)建一個新的對象。

可以返回原返回類型的任何子類對象。

創(chuàng)建參數(shù)化類型實例時更加簡潔,比如調(diào)用構(gòu)造 HashMap 時,使用 Map m = HashMap.newInstance() ,與 Mapm> = new HashMap>();

2、遇到多個構(gòu)造器參數(shù)時要考慮用構(gòu)建器

靜態(tài)工廠和構(gòu)造器不能很好地擴展到大量的可選參數(shù)。

JavaBean 模式下使用 setter 來設(shè)置各個參數(shù),無法僅通過檢驗構(gòu)造器參數(shù)的有效性來保證一致性,會試圖使用不一致狀態(tài)的對象。

Builder 的建造者模式:使用必須的參數(shù)調(diào)用構(gòu)造器,得到一個 Builder 對象,再在 builder 對象上調(diào)用類似 setter 的方法設(shè)置各個可選參數(shù),最后調(diào)用無參的 build 方法生成不可變對象,new Instance.Builder(必須參數(shù)).setter(可選參數(shù)).build()。

Builder 模式讓類的創(chuàng)建和表示分離,使得相同的創(chuàng)建過程可以創(chuàng)建不同的表示。

3、避免創(chuàng)建不必要的對象

對于 String 類型,String s = new String("") 每次執(zhí)行時都會創(chuàng)建一個新的實例,而使用 String s = "" 則不會,因為對于虛擬機而言,包含相同的字符串字面常量會重用,而不是每次執(zhí)行時都創(chuàng)建一個新的實例。

優(yōu)先使用基本類型而不是裝箱的基本類型,避免無意識的自動裝箱。

4、消除過期的對象引用

緩存時優(yōu)先使用 WeakHashMap,LinkedHashMap 這些數(shù)據(jù)結(jié)構(gòu),及時清掉沒用的項。

顯示取消監(jiān)聽器和回調(diào),或進(jìn)行弱引用。

對于所有對象都通用的方法
5、覆蓋 equals

如果類具有自己特有的"邏輯相等",但超類還沒有覆蓋 equals 以實現(xiàn)期望的行為。

高質(zhì)量equals的方法

使用 == 操作符檢查”參數(shù)是否為這個對象的引用“。

使用 instanceof 操作符檢查“參數(shù)是否為正確的類型”。

把參數(shù)轉(zhuǎn)換成正確的類型。

對于該類中的每個關(guān)鍵域,檢查參數(shù)中的域是否與該對象中對應(yīng)的域相匹配。

不要將 equals 聲明的 object 對象替換為其他的類型,因為這樣是沒法覆蓋 Object.equals,只是提供了一個重載。

6、覆蓋 equals 時總是覆蓋 hashCode

相等的對象必須具有相等的散列碼,如果沒有一起去覆蓋 hashcode,則會導(dǎo)致倆個相等的對象未必有相等的散列碼,造成該類無法結(jié)合所有基于散列的集合一起工作。

7、總是覆蓋 toString

Object 提供的 toString,實現(xiàn)是類名+@+散列碼的無符號十六進(jìn)制。

自己覆蓋的 toString,返回對象中包含的所有值得關(guān)注的信息。

不足:當(dāng)類被廣泛使用,一旦指定格式,那就會編寫出相應(yīng)的代碼來解析這種字符串表示法,以及把字符串表示法嵌入持久化數(shù)據(jù)中,之后若改變這種表示法,則會遭到破壞。

8、考慮實現(xiàn) Comparable 接口

如果類實現(xiàn)了comparable 接口,便可以跟許多泛型算法以及依賴該接口的集合實現(xiàn)協(xié)作,比如可以使用 Array.sort 等集合的排序。

類和接口
9、使類和成員的可訪問性最小化

隱藏內(nèi)部實現(xiàn)細(xì)節(jié),有效解耦各模塊的耦合關(guān)系

訪問級別

private:類內(nèi)部才可訪問

package-private(缺省的):包內(nèi)部的任何類可訪問

protected:聲明該成員的類的子類以及包內(nèi)部的類可訪問

public:任何地方均可訪問

10、復(fù)合優(yōu)于繼承

繼承打破了封裝性,除非超類是專門為了擴展而設(shè)計的。超類若在后續(xù)的發(fā)行版本中獲得新的方法,并且其子類覆蓋超類中與新方法有關(guān)的方法,則可能會發(fā)生錯誤。

復(fù)合:在新的類中增加一個私有域,引用現(xiàn)有類。它不依賴現(xiàn)有類的實現(xiàn)細(xì)節(jié),對現(xiàn)有類進(jìn)行轉(zhuǎn)發(fā)。

11、接口優(yōu)于抽象類

抽象類允許包含某些方法的實現(xiàn),但為了實現(xiàn)由抽象類定義的類型,類必須成為抽象類的一個子類,且是單繼承。

接口允許我們構(gòu)造非層次結(jié)構(gòu)的類型框架,安全地增強類的功能。

對每個重要的接口都提供一個抽象的骨架實現(xiàn)類,把接口和抽象類的優(yōu)點結(jié)合(接口不能包含具體的方法,抽象類使用繼承來增加功能)。它們?yōu)槌橄箢愄峁┝藢崿F(xiàn)上的幫助,但又不強加抽象類被用作類型定義時所特有的嚴(yán)格限制。

抽象類的演變比接口的演變要容易得多,在后續(xù)版本中在抽象類中始終可以增加新的具體方法,其抽象類的所有子類都將提供這個新的方法,而接口不行。

12、接口只用于定義類型

當(dāng)類實現(xiàn)接口時,接口充當(dāng)可以引用這個類的實例的類型,為了任何其他目的而定義接口時不恰當(dāng)?shù)摹?/p>

常量接口時對接口的不良使用。實現(xiàn)常量接口,會導(dǎo)致把這樣的實現(xiàn)細(xì)節(jié)泄漏給該類的導(dǎo)出 API 中,當(dāng)類不再需要這些常量時,還必須實現(xiàn)這個接口以確保兼容性。如果非final類實現(xiàn)了該常量接口,它的所有子類的命名空間都將被接口中的常量污染。

13、優(yōu)先考慮靜態(tài)成員類

靜態(tài)成員類是最簡單的嵌套類,可以當(dāng)做普通的類,只是被聲明在另一個類的內(nèi)部。

非靜態(tài)成員類的每個實例都隱含著與外部類的一個外部實例相關(guān)聯(lián)。沒有外部實例的情況下,是無法創(chuàng)建非靜態(tài)成員類的實例。每個非靜態(tài)成員類的實例都包含一個額外的指向外部對象的引用,會導(dǎo)致外部實例在垃圾回收時仍然保留。

匿名類沒有名字,在使用的同時被聲明和實例化。當(dāng)匿名類出現(xiàn)在非靜態(tài)環(huán)境中時有外部實例,在靜態(tài)環(huán)境中也不能擁有任何靜態(tài)成員。匿名類必須保持簡短,保持可讀性。

局部類,在任何可以聲明局部變量的地方聲明局部類,有名字,在非非靜態(tài)環(huán)境中定義才有外部實例,不能包含靜態(tài)成員,同時必須保持簡短。

枚舉和注解
14、用 enum 代替 int 常量

枚舉類型是指由一組固定的常量組成合法值的類型,通過公有的靜態(tài) final 域為每個枚舉常量導(dǎo)出實例的類,沒有構(gòu)造器,是單例的泛型化。

int 枚舉模式在類型安全性和使用方便性沒有任何幫助,打印的 int 枚舉變量只是一個數(shù)字。

String 枚舉模式雖然提供了可打印的字符串,但會導(dǎo)致性能問題,還依賴于字符串的比較操作。

枚舉類型可以通過 toString 將枚舉轉(zhuǎn)換成可打印的字符串,還允許添加任意的方法和域,并實現(xiàn)任意的接口。

性能缺點:裝載和初始化枚舉時會有空間和時間的成本。

方法
15、檢查參數(shù)的有效性

對于公有方法,用 Javadoc 的 @throw 標(biāo)簽在文檔中說明違反參數(shù)限制時會拋出的異常。

對于未被導(dǎo)出的方法(私有的),可以使用斷言來檢查參數(shù)。斷言如果失敗會拋出 AssertionException,如果沒起到作用也不會有成本開銷。

每當(dāng)編寫方法或構(gòu)造器時,要考慮它的參數(shù)有哪些限制,應(yīng)該把這些限制寫到文檔中,并且在方法體的開頭處進(jìn)行顯示的檢查。

16、必要時進(jìn)行保護(hù)性拷貝

對方法的每個可變參數(shù),或返回一個指向內(nèi)部可變組件的引用時,需要進(jìn)行保護(hù)性拷貝,避免在使用過程中可變對象進(jìn)行了修改。

保護(hù)性拷貝是在檢查參數(shù)的有效性之前進(jìn)行的,并且有效性檢查是針對拷貝之后的對象。

17、 慎用重載

重載方法的選擇是靜態(tài)的,選擇工作時在編譯時進(jìn)行,完全基于參數(shù)的編譯時類型。

覆蓋方法的選擇是動態(tài)的,選擇的依據(jù)是被調(diào)用方法所在對象的運行時類型。

不要導(dǎo)出倆個具有相同參數(shù)數(shù)目的重載方法,如果參數(shù)數(shù)目相同,則至少有一個對應(yīng)的參數(shù)在倆個重載方法中具有根本不同的類型,否則就應(yīng)該保證,當(dāng)傳遞同樣的參數(shù)時,所有的重載方法的行為必須一致。

18、返回零長度的數(shù)組或集合,而不是 null

對于返回 null 而不是零長度數(shù)組或集合的方法,幾乎每次用到該方法時都需要進(jìn)行 null 值的判斷,這樣很曲折同時很容易出錯。

通用程序設(shè)計
19、基本類型優(yōu)于裝箱基本類型

基本類型只有值,而裝箱基本類型可以具有相同的值和不同的同一性。對裝箱基本類型運用 == 操作符幾乎總是錯誤的。

基本類型只有功能完備的值,而每個裝箱基本類型除了它對應(yīng)的基本類型的所有功能值外,還有個非功能值:null。當(dāng)在一項操作中混合使用基本類型和裝箱基本類型時,裝箱基本類型會自動拆箱,如果 null 對象引用被自動拆箱,會得到空指針異常。

基本類型通常比裝箱基本類型更節(jié)省時間和空間,裝箱基本類型會導(dǎo)致高開銷和不必要的對象創(chuàng)建。

20、當(dāng)心字符串連接的性能

字符串是不可變的,當(dāng)倆個字符串連接時需要對其內(nèi)容進(jìn)行拷貝,連接 n 個字符串需要 n 的平方級時間。因為第 n 次拼接的字符串,需要 n-1 次的字符串和第 n 次的字符串拷貝,和他們拼接后的拷貝,這樣 an - an-1 = n-1+1+n = 2n;這樣可以得到 an = n*(n-1),及 O(N^2) 的拼接時間。

21、通過接口引用對象

如果有合適的接口類型存在,那么對于參數(shù)、返回值、變量和域來說,就都應(yīng)該使用接口類型進(jìn)行聲明。如,List<>vector = new Vector<>();List list = new ArrayList<>(); ,這樣程序會更加靈活,當(dāng)更換實現(xiàn)時,所要做的只是改變構(gòu)造器中的類。

如果沒有合適的接口存在,完全可以用類而不是類接口來引用對象。如果含有基類,則優(yōu)先使用基類來引用這個對象而不是它的實現(xiàn)類。

異常
22、只針對異常的情況才使用異常

異常是為了在異常情況下使用而設(shè)計的,不要將他們用于普通的控制流,而不要編寫破事他們這么做的 API。

基于異常的循環(huán)模式不僅模糊了代碼的意圖,降低了性能( JVM 不會對異常的代碼塊進(jìn)行優(yōu)化),而且它還不能保證正常工作。

23、對可恢復(fù)的情況使用受檢異常,對編程錯誤使用運行時異常

受檢異常:如果期望調(diào)用者能適當(dāng)?shù)鼗謴?fù),這時應(yīng)該使用受檢的異常。通過拋出受檢的異常,強迫調(diào)用者在一個 catch 中處理該異常或傳播出去。

未受檢異常:不需要也不應(yīng)該被捕獲的可拋出結(jié)構(gòu)。

運行時異常:表明編程錯誤,是 RuntimeException 的子類,運行時檢查。

錯誤:表示資源不足,約束失敗,或其他使程序無法繼續(xù)執(zhí)行的條件。

設(shè)計受檢異常拋出 API 的條件:正確地使用 API 不能阻止這種異常條件的產(chǎn)生 & 產(chǎn)生異常后可以立即采取有用的動作。

24、拋出與抽象相對應(yīng)的異常

當(dāng)方法傳遞由低層抽象拋出的異常與所執(zhí)行的任務(wù)沒有明顯聯(lián)系時,會導(dǎo)致困擾且讓實現(xiàn)細(xì)節(jié)污染了更高層 API。

更高層的實現(xiàn)應(yīng)該捕獲低層的異常,同時拋出可以按照高層抽象進(jìn)行解釋的異常(異常轉(zhuǎn)譯)。

25、努力使失敗保持原子性

失敗原子性:失敗的方法調(diào)用應(yīng)該使對象保持在被調(diào)用之前的狀態(tài)。

設(shè)計不可變對象,永遠(yuǎn)不會使已有的對象保持在不一致的狀態(tài)中。

對于可變對象:

執(zhí)行操作之前檢查參數(shù)的有效性。

調(diào)整計算處理過程的順序,使得任何可能失敗的計算部分都在對象狀態(tài)被修改之前發(fā)生。

編寫一段恢復(fù)代碼,由它來攔截操作過程中發(fā)生的失敗,以及對象回滾到操作開始之前的狀態(tài)上,主要用于永久性的數(shù)據(jù)結(jié)構(gòu)。

在對象的一份臨時拷貝上執(zhí)行操作,不破壞傳入對象的狀態(tài)。

并發(fā)
26、同步訪問

同步可以阻止一個線程看到對象處于不一致的狀態(tài)之中,還能保證進(jìn)入同步方法或者同步代碼塊的每個線程,都看到由同一個鎖保護(hù)的之前所有的修改效果。

多個線程共享可變數(shù)據(jù)時,每個讀或者寫數(shù)據(jù)的線程都必須執(zhí)行同步,否則可能導(dǎo)致活性失敗和安全性失敗。

活性失敗:線程A對某變量值的修改,可能沒有立即在線程B體現(xiàn)出來。

安全性失敗:并發(fā)訪問共享資源導(dǎo)致狀態(tài)不一致造成的安全問題。

過度同步可能會導(dǎo)致性能降低、死鎖,甚至不確定的行為。

在同步區(qū)域內(nèi)做盡可能少的工作,過度的同步會丟失并行的機會,限制 VM 優(yōu)化代碼執(zhí)行的能力

不要從同步區(qū)域內(nèi)部調(diào)用外來方法,避免死鎖和數(shù)據(jù)破壞。

CopyOnWriteArrayList 通過重新拷貝整個底層數(shù)組實現(xiàn)所有的寫操作,適用于讀操作遠(yuǎn)大于寫操作的場景,當(dāng)寫操作頻繁時性能損耗很大。

序列化
27、謹(jǐn)慎地實現(xiàn) Serializable 接口

一旦一個類被發(fā)布,就大大降低了“改變這個類的實現(xiàn)” 的靈活性。若接受了默認(rèn)的序列化形式,并且以后要改變類的內(nèi)部結(jié)構(gòu),會導(dǎo)致序列化形式的不兼容。其次序列化對應(yīng)流的唯一標(biāo)識符 UID,在沒有顯示聲明序列版本 UID,那么改變類的信息,將產(chǎn)生新的序列版本 UID,破壞它的兼容性。

增加了出現(xiàn) bug 和安全漏洞的可能性。反序列化機制中沒有顯示的構(gòu)造器,很容易忘記要確保:反序列化過程必須要保證所有“由真正的構(gòu)造器建立起來的約束關(guān)系”,并且不允許攻擊者訪問正在構(gòu)造過程中的對象的內(nèi)部信息。

測試負(fù)擔(dān)增加。當(dāng)一個可序列號的類被修訂時,需要檢查“在新版本中序列化一個實例,然后再舊版本中反序列號”,反之亦然,這種測試不可自動構(gòu)建,測試工作量與“可序列化的類的數(shù)量和發(fā)行版本號”的乘積成正比。

本文發(fā)表于個人博客:http://lavnfan.github.io/,歡迎指教。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70342.html

相關(guān)文章

  • effective java 觀后感

    摘要:這本書是我第一次買的,從買來至今整本書還沒有看完,只看了一半,原因是個人比較懶,而且玩的心比較大,經(jīng)過這么多年的沉淀,終于可以偷點時間寫下對于這本書的觀后感了整本書給我的感覺不像是一個技術(shù)書,更多的是講解一些實用技巧,而對于我這個職場菜鳥來 effective Java 這本書是我第一次買的, 從買來至今整本書還沒有看完, 只看了一半, 原因是個人比較懶,而且玩的心比較大,經(jīng)過這么多年...

    calx 評論0 收藏0
  • Java 學(xué)習(xí)資料總結(jié)

    摘要:三進(jìn)階階段這個階段主要是靠我們自己學(xué)習(xí)總結(jié),可以通過前輩們的博客或者自己研究源碼,這些非常有利于我們快速的成長。讓自己保持永遠(yuǎn)學(xué)習(xí)的精神。五零基礎(chǔ)學(xué)習(xí)資料最后給大家準(zhǔn)備了一份不錯的學(xué)習(xí)資源,里面有很多學(xué)習(xí)視頻和資料,后臺回復(fù)資源,即可獲取。 showImg(https://segmentfault.com/img/bVbauV8?w=1212&h=816); 前兩次給大家分享了關(guān)于 j...

    FleyX 評論0 收藏0
  • 【轉(zhuǎn)】成為Java頂尖程序員 ,看這10本書就夠了

    摘要:實戰(zhàn)高并發(fā)程序設(shè)計這本書是目前點評推薦比較多的書,其特色是案例小,好實踐代碼有場景,實用。想要學(xué)習(xí)多線程的朋友,這本書是我大力推薦的,我的個人博客里面二十多篇的多線程博文都是基于此書,并且在這本書的基礎(chǔ)上進(jìn)行提煉和總結(jié)而寫出來的。 學(xué)習(xí)的最好途徑就是看書,這是我自己學(xué)習(xí)并且小有了一定的積累之后的第一體會。個人認(rèn)為看書有兩點好處:showImg(/img/bVr5S5);  1.能出版出...

    DTeam 評論0 收藏0
  • 你應(yīng)當(dāng)知道的Java牛人 v2.0

    摘要:你應(yīng)當(dāng)了解的位牛人編譯李雋龍。擁有四項發(fā)明專利,據(jù)稱他的凈資產(chǎn)值高達(dá)億美元。年月日,在其博客上宣布調(diào)離安卓部門并將承擔(dān)谷歌公司新的項目。年月日,通知執(zhí)行委員會他將不再參選。后來,又重新當(dāng)選了理事會的全權(quán)代表。 Java領(lǐng)域有很多著名的人物,他們?yōu)镴ava社區(qū)編寫框架、產(chǎn)品、工具或撰寫書籍改變了Java編程的方式。本文是《最受歡迎的8位Java牛人》的2.0版本。 ChangLo...

    _Suqin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<