2012-11-25 129 views
3

我讀Collections.shuffle(List) javadoc,然後看了看在RandomAccess javadocRandomAccess接口,爲什麼沒有方法?

使用List實現,以表明他們 支持快速(通常是固定時間)隨機訪問的標記接口。 [...]

我想知道爲什麼這個接口(如Serializable)沒有方法?這是什麼設計理由?

即使只列出「執行」這個界面,爲什麼不設置E get()作爲一種方法呢?我知道不是每個列表都是隨機訪問,但如果沒有方法,我怎麼能使用這個接口?

事情是這樣的:

if(object instanceof RandomAccess){ 
    // should I cast it if no operations can be done? why? 
} 

而且,僅列出可以RandomAccess的?什麼文件?

+0

由於javadoc的狀態,它是一個*「標記」*接口,根據定義將不會有方法。它標誌着具有快速隨機訪問的List實現,所以使用該實現的人會知道他們正在使用的類是經過優化的。 –

回答

10

「標記」界面是一種先於註釋的技術;它旨在將一個類標記爲符合某些標準,其標準不是關於方法。

在這種情況下,Shuffle可能在不支持快速隨機訪問的列表上採取不同的行爲。考慮你如何洗牌鏈表;這很難,對吧?你不能只是說「給我一個隨機元素」,而不去通過下一個元素的指針。現在將其與ArrayList進行對比。由於存儲列表的方式,獲取隨機元素要容易得多。

沒有辦法在方法名中限定「如何存儲列表」或「不同訪問模式可能有多快或多慢」。相反,Java使用標記接口來提供這些信息。

在這種情況下,ArrayList將是一個RandomAccess,並且LinkedList不會。

編輯

有興趣的標誌接口和標記註釋將享受項目37之間的區別:「使用標記接口來定義類型」有效的Java第二版由約書亞布洛赫。

+1

我不認爲拒絕列表適合於Shuffles的代碼(因爲它已經實現了一個需要列表的方法)。但它可能會爲鏈表選擇不同的算法(例如先複製列表,或者執行不需要隨機訪問的算法)。 – Thilo

+0

@Thilo好點,回答更新。 –

+3

+1將標記界面與註釋相關聯! – akuhn

1

這是一個標記界面。它定義了一種不使用任何額外方法的行爲或功能。

在這種情況下,它說隨機訪問(已經在List接口中定義)不僅可能,而且也是有效的。根據這個,使用List的代碼可以在算法之間切換。

有人可能會認爲,如果這是一個好的設計決定。例如,隨機訪問方法可能已從List中刪除(只允許迭代),並將其放入RandomAccess接口中。同樣,對象序列化系統的方法可能已被放入Serializable接口。

另外,只有列表可以是RandomAccess?

我想接口也可以用於其他的東西,但它看起來像它目前只使用的列表。

什麼是文件?

有一個單獨的隨機訪問文件機制(java.io.RandomAccessFile)。

相關問題