Effect Java 閱讀筆記(一)

2021-08-04 13:53:05 字數 4007 閱讀 7495

乙個靜態工廠的小例子

//以下方法得到的物件是事先構造好的不可變物件,反覆利用

public

static boolean valueof(boolean b)

使用靜態工廠的優勢

靜態工廠方法的缺點

簡而言之,如果類的構造器或者靜態工廠中具有多個引數,設計這種類時,builder模式就是不錯的選擇

singleton指僅僅被例項化一次的類,singleton通常備用來代表那些本質上唯一的元件

顯示指定構造器是私有的(則該類不可被例項化,也同時不可被子類化)

ps : 企圖通過將類做成抽象類來強制該類不可被例項化是行不通的,該類可被繼承,繼而例項化

本條提及「當你應該重用物件的時候,請不要建立物件」,對應的在39條說「當你應該建立物件的時候,請不要重用現有物件」

實現高質量equals的訣竅

幾點告誡

public

final

class

phonenumber

private

void

rangecheck(int arg, int max, string name)

@override

public

boolean

equals(object o)

@override

public

inthashcode()

public

static

void

main(string args)

}

按照下面的公式,把上述步驟計算得到的雜湊碼c合併到result中

result = 32 * result + c

返回result

完成了hashcode方法驗證以後,問問自己「相等的例項是否都具有相等的雜湊碼」

private

volatile

int hashcode;

@override

public

inthashcode()

return result;

}

不要試圖從雜湊碼計算中排除掉乙個物件的關鍵部分來提高效能

返回的字串應該是簡潔的,但資訊豐富,並且易於閱讀

例項域決不能是公有的

類具有公有的靜態final陣列域,或者返回這種與的訪問方法,這幾乎總是錯的

//potential security hole

public

static

final thing values = ;

解決方法:

private

static

final thing private_values = ;

//build a unmodified view for the static array

public

static

final listvalues = collections.unmodifiablelist(arrays.aslist(private_values));

可以使陣列變成私有的,並新增乙個公有的方法,它返回私有陣列的乙個備份

private

static

final thing private_values = ;

public

static

final thing values()

不可變類:例項不能被修改的類,每個例項包含的資訊都必須在建立該例項時就提供,並且在整個生命週期(lifetime)內固定不變。(string, 基本型別的包裝類,biginteger,bigdecimal)=>不可變模擬可變類更易於設計、實現和使用。他們 不容易出錯且更加安全

不可變類本質上是執行緒安全的,它不要求同步,可被自由的共享

不可變類唯一的缺點就是對於每個不同的值都要有乙個單獨的物件

堅決不不要為每個get方法編寫乙個相應的set方法。除非有很好的理由要讓類成為可變的類,否則就應該是不可變的(唯一的缺點就是在特定的情況下存在潛在的效能缺陷)

如果類不能被做成不可變的,仍然應該盡可能地限制它的可變性

採用復合/**的方法來代替instrumentedhashset類。(包含類本身和可重用的**類 forwarding classs, 包含了所有**方法,沒有其他方法)

class instrumentedhashsetextends forwardingset

@override

public

boolean

add(e o)

@override

public

boolean

addall(collection<? extends e> c)

public

intgetaddcount()

}//reusable forwarding class

class forwardingsetimplements set

@override

public

intsize()

@override

public

boolean

isempty()

@override

public

boolean

contains(object o)

@override

public iteratoriterator()

@override

public object toarray()

@override

public

t toarray(t a)

@override

public

boolean

add(e e)

@override

public

boolean

remove(object o)

@override

public

boolean

containsall(collection<?> c)

@override

public

boolean

addall(collection<? extends e> c)

@override

public

boolean

retainall(collection<?> c)

@override

public

boolean

removeall(collection<?> c)

@override

public

void

clear()

}

簡而言之,繼承功能非常強大,但也存在諸多問題,因為它違背了封裝原則。只有當子類和超類之前確實存在繼承關係(is-a),使用繼承才是恰當的。即便如此,如果子類和超類處在不同的包中,並且超類並不是為了繼承而設計的,那麼繼承兼顧會導致脆弱性。

閱讀筆記一

保持軟體設計的品質。壞的架構設計會招致更壞的架構設計。開發團隊中健康的工作關係將直接有益於軟體設計。不健康的關係和個性膨脹會導致不健康的軟體。軟體設計的關鍵品質是內聚和耦合。高內聚 strongcohesion 和低耦合 low coupling 鬆弛而模糊的架構將導致每個 元件編寫得不好,並且相互...

Dissecting MFC 閱讀筆記 一

閱讀下面一段程式,並寫出它的執行結果 include include 成員訪問許可權和繼承控制都是 private 再加加上 整合的方式是 public 所以才能訪問資料成員 class classa void func2 virtual void vfunc1 virtual void vfunc...

c primer plus閱讀筆記(一)

int a 1 undigned int b 0 cout 4294967295 typename value c typename value c static cast value 更加嚴格的強轉auto a 100 int auto b 10.0 double auto iter vector...