当我阅读LinkedList的源代码时,我发现了一个奇怪的现象(可能只是我自己……(,许多公共方法不做其他事情,只调用另一个私有方法,如下所示。
public void addFirst(E e) {
linkFirst(e);
}
public void addLast(E e) {
linkLast(e);
}
因此,有人能告诉我为什么方法应该这样写吗,非常感谢
好吧,方法addFirst(E e)
&addLast(E e)
都是必需的,因为java.util.LinkedList
实现了指定这两个方法的接口java.util.Deque
。
如今,你会在这两个实现上使用@Override
注释来向编译器表明你知道这一点,但在编写这些代码的时候,注释并没有那么普遍(甚至是发明的?(。(注释最初在JDK 1.5中公开(
现在,linkFirst(E e)
是私有的&只从addFirst(E e)
调用,所以也许你可以认为它可以内联,但也许有人认为保护该逻辑是谨慎的,因为addFirst(E e)
是公共的;可以被细分。
CCD_ 9具有默认可见性&从许多地方调用,因此它可以从java.util
包中的其他成员调用,但由于addLast(E e)
可能是子类的,因此可能再次认为不公开此逻辑是谨慎的。
正如Jeroen所评论的,当一个类实现(直接或间接(多个接口时,这样做通常是为了避免编写多个做相同事情的方法,并且接口方法具有重叠的语义。
但在这种情况下,linkFirst
和linkLast
是内部方法。在这里,原因似乎是代码已经重组,这是重组的结果。Java 6源代码实现这些方法如下:
public void addFirst(E e) {
addBefore(e, header.next);
}
public void addLast(E e) {
addBefore(e, header);
}
这有关系吗?它效率低吗?
可能不会。JIT编译器很可能在调用addFirst
和addLast
方法的任何位置内联它们。但即使没有,不必要的呼叫的开销也很小。