摘要:但由于模式本身有嚴(yán)重的缺陷,由于構(gòu)造方法在多次調(diào)用中被分割,導(dǎo)致可能處于不一致的狀態(tài),并且還需要額外增加工作以確保線程安全。方法必須遵從類指定的常規(guī)約定,將不同的哈希碼分配給不同的實(shí)例對(duì)象。
1.使用靜態(tài)工廠方法替代構(gòu)造方法
靜態(tài)工廠方法的優(yōu)點(diǎn):
不像構(gòu)造方法,它是有名字的。
它不需要每次調(diào)用時(shí)都創(chuàng)建一個(gè)新對(duì)象。
它可以返回 其返回類型的任何子類型的對(duì)象。
返回對(duì)象的類可以根據(jù)輸入?yún)?shù)的不同而不同。
在編寫包含該方法的類時(shí),返回的對(duì)象的類不需要存在。
當(dāng)一個(gè)對(duì)象中,屬性過多時(shí),使用構(gòu)造方法時(shí),參數(shù)過多導(dǎo)致難以維護(hù),并且很難讀懂每個(gè)參數(shù)的含義是什么。
使用 構(gòu)造方法 來構(gòu)建必傳參數(shù),而用 setter 的方式來傳可選參數(shù)呢?這看似參數(shù)少,創(chuàng)建實(shí)例也很容易,并且所生成的代碼也易于閱讀。但由于 JavaBeans 模式本身有嚴(yán)重的缺陷,由于構(gòu)造方法在多次調(diào)用中被分割,導(dǎo)致 JavaBeans 可能處于不一致的狀態(tài),并且還需要額外增加工作以確保線程安全。
最好處理參數(shù)過多的方法是使用 builder 模式,它結(jié)合了可伸縮構(gòu)造方法模式的安全性和 JavaBeans 模式的可讀性,然后在調(diào)用 builder 對(duì)象的 setter 相似方法來設(shè)置每個(gè)可選參數(shù)。
3.使用依賴注入的方式注入資源依賴注入的實(shí)踐將極大地增強(qiáng)類的靈活性、可重用性和可測試性。
4.不要?jiǎng)?chuàng)建不必要的對(duì)象如果對(duì)象是不可變的,它總是可以被重用的,比如 String 類是 final 的,不可變的,最好不要用 new String("test"), 因?yàn)樗看味紩?huì)創(chuàng)建一個(gè)新的對(duì)象。在性能有嚴(yán)格要求的情況下,優(yōu)先使用基本類型而不是裝箱的基本類型,也要注意無意識(shí)的自動(dòng)裝箱,因?yàn)樗鼈儠?huì)影響性能。
5.消除過期的對(duì)象引用這個(gè)也就是常說的內(nèi)存泄露。當(dāng)一個(gè)類自己管理內(nèi)存時(shí),應(yīng)該警惕內(nèi)存泄漏問題。 每當(dāng)一個(gè)元素被釋放時(shí),元素中包含的任何對(duì)象引用都應(yīng)該被清除。
另一個(gè)常見的內(nèi)存泄漏來源是緩存。一旦將對(duì)象引用放入緩存中,很容易忘記它的存在,可以用 WeakHashMap 來表示緩存。
6.避免使用 Finalizer 和 Cleaner 機(jī)制,請(qǐng)使用 try-with-resources 語句用于 Finalizer 和 Cleaner 機(jī)制的不確定性,我們不知道它到底何時(shí)會(huì)執(zhí)行。例如,依賴于 Finalizer 和 Cleaner 機(jī)制來關(guān)閉文件是嚴(yán)重的錯(cuò)誤,因?yàn)榇蜷_的文件描述符是有限的資源。 如果由于系統(tǒng)遲遲沒有運(yùn)行 Finalizer 和 Cleaner 機(jī)制而導(dǎo)致許多文件被打開,程序可能會(huì)失敗,因?yàn)樗荒茉俅蜷_文件了??梢杂?try-with-resources 語句 或 try-finally 語句,當(dāng)打開多個(gè)文件時(shí),try-finally 語句的可讀性就不如 try-with-resources 語句,因此推薦使用 try-with-resources 語句。
7.重寫 equals 方法時(shí)同時(shí)也要重寫 hashcode 方法重寫 equals 方法時(shí),需要滿足以下特性。
自反性:一個(gè)對(duì)象必須與自身相等。
對(duì)稱性:任何非空引用 x 和 y,如果且僅當(dāng) y.equals(x) 返回 true 時(shí) x.equals(y) 必須返回 true。
傳遞性:如果第一個(gè)對(duì)象等于第二個(gè)對(duì)象,第二個(gè)對(duì)象等于第三個(gè)對(duì)象,那么第一個(gè)對(duì)象必須等于第三個(gè)對(duì)象。
一致性:如果兩個(gè)對(duì)象是相等的,除非一個(gè)(或兩個(gè))對(duì)象被修改了, 那么它們必須始終保持相等。
非空性:對(duì)于任何非空引用 x,x.equals(null) 必須返回 false。
每次重寫 equals 方法時(shí)都必須重寫 hashCode 方法,否則程序?qū)o法正常運(yùn)行。 hashCode 方法必須遵從 Object 類指定的常規(guī)約定,將不同的哈希碼分配給不同的實(shí)例對(duì)象。
8.始終重寫 toString 方法Object 類提供了 toString 方法的實(shí)現(xiàn)是包名+類名+@+哈希碼的無符號(hào)十六進(jìn)制。toString 的通用約定要求,返回的字符串應(yīng)該是“一個(gè)簡潔但內(nèi)容豐富的表示,對(duì)人們來說是很容易閱讀的”。就需要 toString 方法,方便可讀性。
9.考慮實(shí)現(xiàn) Comparable 接口在需要可比較的場景中,最好實(shí)現(xiàn) Comparable 接口,以便在基于比較的集合中輕松對(duì)其實(shí)例進(jìn)行排序,搜索和使用。 比較 compareTo 方法的實(shí)現(xiàn)中的字段值時(shí),請(qǐng)避免使用"<"和">"運(yùn)算符。 最好使用包裝類中的靜態(tài) compare 方法或 Comparator 接口中的構(gòu)建方法。
10.使類和成員的可訪問性最小化一個(gè)優(yōu)秀設(shè)計(jì)的組件隱藏了它的所有實(shí)現(xiàn)細(xì)節(jié),干凈地將它的 API 與它的實(shí)現(xiàn)分離開來。然后,組件只通過它們的 API 進(jìn)行通信,并且對(duì)彼此的內(nèi)部工作一無所知。稱為信息隱藏或封裝,是軟件設(shè)計(jì)的基本原則。
Java中的四種訪問級(jí)別:
private——只能自己訪問。
package-private——默認(rèn)級(jí)別,同包中的任意類訪問。
protected——子類和自己可以訪問。
public —— 任何類都可訪問。
PS:
清山綠水始于塵,博學(xué)多識(shí)貴于勤。
我有酒,你有故事嗎?
微信公眾號(hào):「清塵閑聊」。
歡迎一起談天說地,聊代碼。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/74152.html
摘要:通過請(qǐng)求和響應(yīng)的交換達(dá)成通信協(xié)議中已經(jīng)規(guī)定了請(qǐng)求是從客戶端發(fā)出,最后由服務(wù)端響應(yīng)這個(gè)請(qǐng)求并返回。隨后的字符串指明了請(qǐng)求訪問的資源對(duì)象。協(xié)議自身不對(duì)請(qǐng)求和響應(yīng)之間的通信狀態(tài)進(jìn)行保存,也就是說這個(gè)級(jí)別。從前發(fā)送請(qǐng)求后需等待并受到響應(yīng)。 showImg(https://segmentfault.com/img/bVbmDsG?w=1024&h=538); http協(xié)議用戶客戶端和服務(wù)器之間的...
摘要:報(bào)文用于協(xié)議交互的信息被稱為報(bào)文。現(xiàn)在出現(xiàn)的各種首部字段及狀態(tài)碼稍后會(huì)闡述。狀態(tài)碼響應(yīng)報(bào)文包含了多個(gè)范圍的內(nèi)容使用。如果服務(wù)器無法響應(yīng)范圍請(qǐng)求,則會(huì)返回狀態(tài)碼和完整的實(shí)體內(nèi)容。 showImg(https://segmentfault.com/img/bVbthNL?w=900&h=500); http報(bào)文 用于HTTP協(xié)議交互的信息被稱為HTTP報(bào)文。請(qǐng)求端的http報(bào)文叫做請(qǐng)求報(bào)文...
摘要:誕生了在深入學(xué)習(xí)之前我們來了解一下他的背景,同時(shí)了解一下當(dāng)時(shí)制定的初衷,這樣有助于我們更好的理解。為知識(shí)共享而規(guī)劃的在年月,互聯(lián)網(wǎng)還只屬于少數(shù)人,在互聯(lián)網(wǎng)的前期,誕生了。的成長時(shí)代年月,成功研發(fā)了世界上第一臺(tái)服務(wù)器和瀏覽器。 showImg(https://segmentfault.com/img/bVblTgr?w=800&h=400);在當(dāng)前大前端的環(huán)境下,前后端分離,前后端同構(gòu)等...
閱讀 1007·2021-11-22 13:54
閱讀 2975·2021-09-28 09:36
閱讀 3064·2019-08-30 15:55
閱讀 2021·2019-08-30 15:44
閱讀 614·2019-08-29 12:31
閱讀 2634·2019-08-28 18:18
閱讀 1294·2019-08-26 13:58
閱讀 1529·2019-08-26 13:44