Effective Java之通用程式設計 總結

2021-09-12 01:44:55 字數 2281 閱讀 2215

第45條 將區域性變數的作用域最小化

要使區域性變數的作用域最小化 最有力的方法就是在第一次使用它的地方宣告

幾乎每個區域性變數的宣告都應該包含乙個初始化表示式

如果在迴圈終止之後不再需要迴圈變數的內容 for迴圈就優先於while迴圈

for (int i = 0, n = expensivecomputation(); i < n; i++) {}

第二個變數n被用來儲存第乙個變數的極限值 從而避免在每次迭代中執行冗餘計算的開銷

使方法小而集中

第46條 for-each迴圈優先於傳統的for迴圈

有三種常見的情況無法使用for-each迴圈

過濾 轉換 平行迭代

第47條 了解和使用類庫

通過使用標準類庫 可以充分利用這些編寫標準類庫的專家的知識 以及在你之前的其他人的使用經驗

在每個重要的發行版本中 都會有許多新的特性被加入到類庫中 所以與這些新特性保持同步是值得的

第48條 如果需要精確的答案 請避免使用float和double

float和double型別尤其不適合用於貨幣計算 它們執行二進位制浮點運算

如果你想讓系統來記錄十進位制小數點 並且不介意因為不使用基本型別而帶來的不便 就請使用bigdecimal

第49條 基本型別優先於裝箱基本型別

當在一項操作中混合使用基本型別和裝箱基本型別時 裝箱基本型別就會自動拆箱

基本型別更加簡單 也更加快速

自動裝箱減少了使用裝箱基本型別的繁瑣性 但是並沒有減少它的風險

第50條 如果其他型別更適合 則盡量避免使用字串

字串不適合代替其他的值型別

字串不適合代替聚集型別

字串也不適合代替能力表

若使用不當 字串會比其他的型別更加笨拙 更不靈活 速度更慢 也更容易出錯

第51條 當心字串連線的效能第52條 通過介面引用物件

如果有合適的介面型別存在 那麼對於引數 返回值 變數和域來說 就都應該使用介面型別進行宣告

如果你養成了用介面作為型別的習慣 你的程式將會更加靈活

如果沒有合適的介面存在 完全可以用類而不是介面來引用物件

第53條 介面優先於反射機制

核心反射機制喪失了編譯時型別檢查的好處

執行反射訪問所需要的**非常笨拙和冗長

效能損失

通常 普通應用程式在執行時不應該以反射方式訪問物件

如果只是以非常有限的形式使用反射機制 雖然也要付出少許代價 但是可以獲得許多好處 對於有些程式 它們必須用到在編譯時無法獲取的類 但是在編譯時存在適當的介面或者超類 通過它們可以引用這個類 如果是這種情況 就可以以反射方式建立例項 然後通過它們的介面或者超類 以正常的方式訪問這些例項

反射機制是一種功能強大的機制 對於特定的複雜系統程式設計任務 它是非常必要的 但它也有一些缺點 如果你編寫的程式必須要與編譯時未知的類一起工作 如有可能 就應該僅僅使用反射機制來例項化物件 而訪問物件時則使用編譯時已知的某個介面或者超類

第54條 謹慎地使用本地方法

使用本地方法來提高效能的做法不值得提倡

如果你必須要使用本地方法來訪問底層的資源 或者遺留**庫 也要盡可能少用本地** 並且要全面進行測試 本地**中的乙個bug就有可能破壞整個應用程式

第55條 謹慎地進行優化

要努力編寫好的程式而不是快的程式

努力避免那些限制效能的設計決策

要考慮api設計決策的效能後果

為獲得好的效能而對api進行包裝 這是一種非常不好的想法

在每次試圖做優化之前和之後 要對效能進行測量

第56條 遵守普遍接受的命名慣例

字面慣例的例子

識別符號型別例子包

com.google.inject, org.joda.time.format

類或者介面

方法或者域

remove, ensurecapacity, getcrc

常量域min_value, negative_infinity

區域性變數

i, xref, housenumber

型別引數

t, e, k, v, x, t1, t2

Effective Java之泛型 總結

第23條 請不要在新 中使用原生態型別 如果使用原生態型別 就失掉了泛型在安全性和表述性方面的所有優勢 如果使用像list這樣的原生態型別 就會失掉型別安全性 但是如果使用像list這樣的引數化型別 則不會 在類文字 class literal 中必須使用原生態型別 set是個引數化型別 表示可以包...

EffectiveJava之19 用類層次代替聯合

1 c中的聯合體 typedef enum shape type typedef struct rectangledimensions t typedef struct circle dimensions t typedef struct dimensions shape t double area...

《effective Java》讀後筆記

為什麼區域性變數要宣告為 final 在jdk 1.8 之前,不用final修飾會編譯報錯。在jdk 1.8 中,不用final修飾不會報錯,但是一旦改變了變數的值就會報錯 區域性類如果乙個內部類需要在多個方法之外仍然是可見的,或者是它太長了,不適合於放在方法內部,就應該使用成員類。如果成員類的每個...