第22條 優先考慮靜態成員類

2022-08-29 00:33:24 字數 1420 閱讀 6028

巢狀類指被定義在乙個類的內部的類。巢狀類存在的目的應該只是為它的外圍類提供服務。如果巢狀類將來可能用於其他環境,它應該是頂層類。

巢狀類有四種:靜態成員類,非靜態成員類,匿名類,區域性類。

靜態成員類的常見用法是作為公有的輔助類,僅當與外部類一起使用才有意義,考慮乙個列舉,它描述計算器支援的各種操作,operation列舉應該是caculator類的公有靜態成員類,然後就可以使用如caculator.operation.plus這樣的名稱來引用這些操作。

非靜態成員類的每個例項都隱含與外圍類的乙個外圍例項相關聯,在非靜態例項方法內部,可以呼叫外圍例項上的方法,或者利用修飾過的this構造獲得外圍例項的引用。如果巢狀類的例項可以在它的外圍類的例項之外獨立存在,這個巢狀類必須是靜態成員類,因為在沒有外圍例項的情況下,要想建立非靜態成員類是不可能的。

非靜態成員類的常見用法是定義乙個adapter,它允許外部類的例項被看作乙個不相關類的實際。例如,map介面實現往往使用非靜態成員類來實現它們的集合檢視,這些集合檢視由keyset,entryset和values方法返回。set和list的迭代器也用非靜態成員類來實現:

public

class mysetextends abstractset

private

class myiterator implements iterator

}

如果成員類不要求訪問外圍例項,就要使它稱為靜態成員類,因為對於非靜態成員類,要有指向外圍類例項的引用,儲存這份引用消耗時間和空間。

私有的靜態成員類的一種常用用法是用來代表外圍類所代表物件的元件。如乙個map例項,它把鍵和值關聯起來,許多map實現的內部都有乙個entry物件,對應於map中的鍵值對。雖然每個entry都與乙個map關聯,但entry上的方法getvalue和setvalue不需要訪問該map,因此,私有的靜態成員類是最佳選擇。

如果內部類是匯出類的公有的或受保護的成員,在靜態和非靜態成員類之間做出正確選擇非常重要,因為一旦做出選擇,在後續的版本就不能修改。

匿名類沒有名字,不是外圍類的乙個成員,在使用的同時被宣告和例項化。常見用法是動態地建立函式物件,例如:

arrays.sort(stringarray, new comparator() 

});

另一種常見用法是建立過程物件,如runnable、thread或者timertask例項,第三種常見用法是在靜態工廠方法的內部。

區域性類使用的最少,在任何可以宣告區域性變數的地方,都可以宣告區域性類,區域性類名字,可以被重複利用(在有效範圍內)。

總結:如果乙個巢狀類需要在單個方法之外仍然可見,或者它太長了,不適合放在方法內部,就應該使用成員類。如果成員類的每個例項都需要乙個指向外圍例項的引用,就做成非靜態的,否則做成靜態的。如果這個巢狀類屬於乙個方法的內部,只需要在乙個地方建立例項,並且有預置的型別可以說明這個類的特徵,就做成匿名類,否則,做成區域性類。

第25課 類的靜態成員變數

本文內容取自於對狄泰學院 唐佐林老師 c 深度解析 課程的學習總結 在 c 中可以定義 靜態成員變數 靜態成員變數 屬於整個類所有 靜態成員變數的生命期不依賴於任何物件 可以 通過類名直接訪問 公有靜態成員變數 所有物件共享類的靜態成員變數 可以 通過物件名訪問 公有靜態成員變數 靜態成員變數的特性...

第25課 類的靜態成員變數

1 通過物件名能夠訪問public成員變數 2 每個物件的成員變數都是專屬的,成員變數不能在物件之間共享 這麼看,如果多個物件想操作同乙個資料,從目前來看只能使用全域性變數 每個物件都可以操作全域性作用域的全域性變數 但是這樣存在安全隱患,在現代軟體開發中不推薦這種方式。那麼,有沒有其它更好的方式呢...

第20條 類層次優先於標籤類

標籤類值帶有兩種甚至多種風格的例項的類,如乙個表示圓或者矩形的類 class figure final shape shape double length double width double radius figure double radius figure double length,dou...