为什么Java List接口不支持getLast()?

Uri*_*Uri 18 java api collections

我正在尝试理解Java标准集合库中的API不一致性.

List或AbstractList中没有方法可以获取最后一项,尽管可以使用size和getIndex()来模拟它.

但是,LinkedList支持该功能.

知道为什么决定不在界面中支持这种方法吗?

Mat*_*och 19

java.util.List接口不支持getLast(),因为设计师去了一个"最低限度接口".通过定义最少数量的方法,它使得它更容易理解和更快学习.

这与"人性化接口"(例如在Ruby数组类中使用)相反,后者试图提供进行常见操作的方法(例如getLast()).由于有许多用途可以将这样的基本概念作为列表放入其中,这往往会导致更大的接口.

有关详细信息,请参阅Martin Fowler的Minimal InterfaceHumane Interface说明.

至于为什么LinkedList支持getLast()等,引用javadoc:

... LinkedList类提供统一命名的方法来获取,删除和插入列表开头和结尾的元素.这些操作允许链表用作堆栈,队列或双端队列(双端队列).

据推测,有人认为一般列表不适合这些特定用例.

作为对Java Collections API(Joshua Bloch)的主要设计者的思想的洞察,他提供了他工作的API设计格言列表.其中,与此问题最相关的是:

早期的API草稿应该简短,通常是一个页面,包含类和方法签名以及单行描述.这样,当您第一次没有正确使用时,可以轻松地重新构建API.

如有疑问,请将其删除.如果有一个API设计的基本定理,就是这样.它同样适用于功能,类,方法和参数.API的每个方面都应尽可能小,但不能小一些.您可以随时添加内容,但不能将其删除.最小化概念权重比类或方法计数更重要.

保持API不受实现细节的影响.它们会混淆用户并抑制进化的灵活性.并不总是很明显什么是实施细节:警惕过度指定.

尽量减少可访问性; 如有疑问,请将其设为私有.这简化了API并减少了耦合.

考虑API设计决策的性能影响,但不要扭曲API以实现性能提升.幸运的是,良好的API通常适合快速实现.

但他也说:

不要让客户做任何图书馆可以做的事情.违反此规则会导致客户端出现样板代码,这很烦人且容易出错.

这只是表明设计指南经常发生冲突,而API设计师工作中最难的部分就是平衡这些冲突.

  • 很好的解释.让我想知道为什么有一个isEmpty方法. (8认同)

Lou*_*nco 5

通常原因是他们想要指定具有Big-O要求的每个函数,并认为无法在所有列表上有效地实现getLast().因此,他们以Big-O承诺在每个级别引入它.

或者它可能只是一个疏忽,或者他们认为它不常见,如果你需要它,你可以得到它与size/getIndex.

  • 我有时希望他们至少将它添加到ArrayList中.一遍又一遍地写arraylist.get(arraylist.size() - 1)是一种样板. (3认同)
  • @Charlie:除非您使用列表界面,并且不想直接知道您的底层实现是什么. (2认同)