RandomAccess接口,为什么没有方法



我正在阅读Collections.shuffle(List)javadoc,然后查看RandomAccess javadoc:

List实现使用的标记接口,用于指示它们支持快速(通常为恒定时间)随机接入。[…]

我想知道为什么这个接口(比如Serializable)没有方法?设计原因是什么?

即使只有Lists"实现"这个接口,为什么不将Eget()设置为一个方法呢?我知道不是每个列表都是随机访问的,但如果没有方法,我该如何使用这个接口?

类似这样的东西:

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

此外,只有列表可以是RandomAccess?文件呢?

"Marker"接口是一种早于注释的技术;它的目的是将类标记为符合某些标准,而这些标准与方法无关。

在这种情况下,Shuffle可能会对不支持快速随机访问的列表采取不同的操作。考虑一下如何打乱链表;这很难,对吧?你不能只说"给我一个随机元素"而不浏览列表,跟随指向下一个元素的指针。现在将其与ArrayList进行对比。由于列表的存储方式,获取随机元素要容易得多。

没有办法在方法名称中限定"列表的存储方式"或"不同访问模式的速度或速度"。因此,Java使用标记接口来提供这些信息。

在这种情况下,ArrayList将是RandomAccess,而LinkedList则不是。

编辑

那些对标记接口和标记注释之间的差异感兴趣的人会喜欢Joshua Bloch的Effective Java第二版中的第37项:"使用标记接口定义类型"。

这是一个标记接口。它定义了一种不使用任何额外方法的行为或能力。

在这种情况下,它表示随机访问(已经在List接口中定义)不仅是可能的,而且是有效的。使用List的代码可以根据此在算法之间切换。

如果这是一个好的设计决策,人们可能会争论。例如,随机访问方法可以从List中删除(只允许迭代),并放在RandomAccess接口中。类似地,对象序列化系统的方法本可以放在Serializable接口中。

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

我想这个接口也可以用于其他事情,但看起来它目前只被Lists使用。

文件呢?

有一个单独的随机访问文件的机制(java.io.RandomAccessFile)。

最新更新