//以下方法得到的物件是事先構造好的不可變物件,反覆利用
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...