首先,考慮編寫iterator,我們需要基於哪幾個方面的考慮:
由於迭代器會訪問list的私有域,因此,可以有2種方式:
一種的改變list的域的可見性,讓其變成public或friendly(預設的可見性,即包可見性)的,不過這違反了良好的物件導向程式設計的羈絆原則,它要求資料盡可能的隱蔽。
另外一種是為list新增乙個內部類或者巢狀類,然後我們來看這2種類的區別。
首先我們需要先理解一下2種類的概念:
將乙個類放入另乙個類的內部,當這個類是static的,表示巢狀類,否則這個類就是內部類。
1,巢狀類
巢狀類是外部類的一部分,所以可以訪問外部類,特性:
巢狀類訪問外部類:
不能直接訪問外部類的非靜態成員
只能直接訪問外部類的靜態成員
外部類訪問巢狀類:
外部類可以訪問巢狀類的私有成員 和
公有成員
so this is **實現:
privatestatic
class myiterator
public
boolean
hasnext()
public
t next()
public
void
remvoe()
}
2,內部類
當宣告乙個內部類時,編譯器會新增對外部類的乙個隱式引用,該物件引起內部類物件的構造。
如果外部類的名字是outer,則隱式引用就是outer.this。
實現:
privateclass myiterator
public
boolean
hasnext()
public
t next()
public
void
remvoe()
}
然後我們再考慮以下方面:
巢狀類的問題在於,在我們的原始設計中,當編寫
arrays而不引用而不引用所在的
mylist物件時,**看起來還行,也似乎有意義,但確實無效的,因為編譯器不可能計算出哪個
mylist在被引用,要是我們自己能夠不必知道這點就好了,而內部類恰好是我們需要的。
在每乙個內部類的物件恰好與外部類的乙個例項相關聯的請情況下,內部類是有用的。
在這種情況下,內部類的物件在沒有外部類物件與其關聯時事永遠不可能純在的,對於迭代器的情形,這種情況剛好適用。
用內部類實現的**更加簡潔有效。
考慮了這些以後,所以實現乙個迭代器的最佳方案就是用內部類。
(ps:網上經常有人把內部類和巢狀類的概念搞錯了,我在這裡更正一下。)
How to 解決乙個問題,找乙個庫,評價乙個庫
一步一步回答完下列的問題,我相信你的答案就呼之欲出了 準備 1.定義要解決的這個問題 2.網上怎麼分解這個問題,同行怎麼分解這個問題 檢索 1.問題複雜度,專案工期,專案成員的能力,可以把握的資源 2.開源專案 朋友使用推薦 同行解決方案 需求 1.使用規模和限制 使用時間 2.對源 需要新增外部庫...
編寫乙個makefile
什麼是makefile?對於大多數的windows程式設計師來講,makefile可能不是那麼重要,因為windows的ide都為程式設計師做好了這個工作。但是在linux下程式設計,會不會寫makefile,從側面上說明乙個人是否具備完成大型工程的能力。makefile的作用 makefile是用...
編寫乙個webpack loader
loader是一種打包的方案,webpack預設只識別js結尾的檔案,當遇到其他格式的檔案後,webpack並不知道如何去處理。此時,我們可以定義一種規則,告訴webpack當他遇到某種格式的檔案後,去求助於相應的loader。新建loaders資料夾並建立三個loaders檔案 remove co...