像是Ruby在前幾篇文章就有提到說,要如何實作其for each語法。在Ruby中是使用了Block的觀念去把上層的程式碼交給下層來處理,也就是說只要能提供類似 .each方法,逐一將直送進yield中即可達成我們要的目標。所以今天我們就來討論一下在JAVA要怎樣來實作。
首先我們先觀察一下目前有哪些類別可以被for each實作...google很快就跟我們說,像是List、Set、HashSet等等,繼承這些介面的類別都可以。透過查看Java doc我們可以很簡單的查覺,這些介面都是繼承於一個名叫做Iterable的介面,點進去看一下,嗯...很好,很清楚著寫著說,只要實作此介面者,都可以被for each所使用,只要在類別中把方法Iterator
整理一下目前的情報,如果要能實作for each就必須實作自Iterable;而要實作Iterable,就必須要提供一個iterator。而一個iterator就需要實作三個方法boolean hasNext()、E next()、void remove()。其中remove則不一定要寫程式碼在裡面,看需求而定。而這邊就提供一個簡單而沒啥意義的簡單範例。
所以其實整個實作的重點就在於要丟出一個Iterator,其可以提供判斷還有沒有下一個元素(hasNext),亦要提供一個方法可以依序丟出集合中的元素(next)。Iterator 怎麼實作就是隨意了,不過基本上還是跟實作Iterable的類別脫離不了關係。這麼辛苦做出來的東西...實用性有多大是不知道(範例是沒啥用的XD),不過如果善加利用也許能夠增加整個程式的效率。
而如果覺得寫那麼多,卻沒啥fu,那還不如直接去繼承ArrayList等類別,善加利用類別中已經提供的方法,還是可以達到製作容器的目的,而且人家早就把程式碼寫好,可以專心處理類別中的其他部分,照樣還是可以用foreach。
(下次來挑戰看看VB好了XD)
沒有留言:
張貼留言