为什么JAVA源代码中的方法调用另一个方法,即使调用方法只是做一个调用工作



当我阅读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所评论的,当一个类实现(直接或间接(多个接口时,这样做通常是为了避免编写多个做相同事情的方法,并且接口方法具有重叠的语义。

但在这种情况下,linkFirstlinkLast是内部方法。在这里,原因似乎是代码已经重组,这是重组的结果。Java 6源代码实现这些方法如下:

public void addFirst(E e) {
addBefore(e, header.next);
}
public void addLast(E e) {
addBefore(e, header);
}

这有关系吗?它效率低吗?

可能不会。JIT编译器很可能在调用addFirstaddLast方法的任何位置内联它们。但即使没有,不必要的呼叫的开销也很小。

最新更新