Bim*_*thy 6 java queue data-structures
当我们有peek()和poll()时,在Queue接口中使用element()和remove()会有什么用?
我检查了文档,发现这些方法也存在于java 7中.提到的唯一区别是element()和remove()会抛出空队列的异常.如果队列为空,我们可以手动抛出异常(如果需要的话).
是否真的有必要为这个唯一的区别保留两套方法?如果我们开始根据这些差异制作不同的方法,我认为java类和接口将充满大量的方法.这是一种真正的面向对象的风格吗?
编辑:只是为了让我的问题清楚,所以我不会得到相同的"你需要异常使用这个,否则使用"答案.我无法理解的是有很多这样的方法,其中有一个具有相同差异的额外方法将是有用的.那么为什么它仅在某些情况下实现而在其他情况下不实现?为什么同样的原则没有全面应用?我可以理解,也许只有语言创作者可以回答这些原因.我想知道这种方法是否符合OOP原则?
Lou*_*man 11
有必要吗?...可能.也许,也许不是.
一般情况下,您应该首选,element()或者remove()如果队列中的队列此时永远不应为空.这是快速失败的一般原则的一部分:如果出现问题,请尽快抛出错误,以便进行调试.(如果你的程序在bug发生时没有立即启动,那么跟踪该bug就会变得非常困难,因为你以后只能在堆栈的不同位置找到它.)
也就是说,如果您不知道队列是否为空,并且您想要查找,那么异常可能具有不可接受的开销,并且返回null可能更可取.
这显然是一个判断呼吁,我可以想象可能已经做出了不同的决定,但我认为所做的呼吁至少是合理的.有很好的理由更喜欢element()到peek()在某些情况下,和很好的理由更喜欢peek()到element()在其他情况下.
就"为什么这种方法在某些情况下而不是在其他情况下使用"而言......答案各不相同,而且始终是一种高度主观的判断.在许多情况下,JDK经常在"失败"时返回null,否则null永远不会是"肯定"答案,否则抛出异常 - 例如,NavigableMap.firstKey()可以返回null,因为null是第一个键,所以它抛出NoSuchElementException一个空map,while NavigableMap.firstEntry()在空地图上返回null,因为不可能混淆null有效的返回.