为什么StringBuffer和StringBuilder的append方法会丢弃超类调用返回的值?

3

这是一道出于好奇的问题。 今天我研究了StringBuilderStringBuffer的实现。这里是它们的append()方法:

public StringBuilder append(String str) {
    super.append(str);
    return this;
}
AbstractStringBuilder.append(str) 方法也返回 this。在 StringBuilder.append(..) 中,舍弃返回值并再次返回 this,有什么好处呢?与其将 super 调用的返回值转换为当前具体实现,不如直接返回 this
3个回答

7

我的第一反应是铸造可能很昂贵,所以如果可以避免的话,那就最好不要使用。


2
与大多数其他事物相比,它并不昂贵,但如果可以在一个非常频繁调用的API方法中(轻松地)避免使用它,那显然是一件好事。 - Michael Borgwardt
实际上它是免费的(如果进行了JIT编译)。 - bestsss

3

我不确定这是否与铸造成本有关。

我认为这种方法之所以被编写成这样,是因为未来的需求可能需要完成比超类中更多的操作。

public StringBuilder append(String str) {
    super.append(str);

    // do something more?

    return this;
}

或者方法定义是在编写类时由IDE自动生成的。或者只是一种编码风格的问题。


2
因为
public StringBuilder append(String str) {
    return (StringBuilder) super.append(str);
}

这很丑陋。它甚至没有变得更短。

(有些语言直接支持这种方式进行方法调用的链接,例如:这里)。

abstract class AbstractStringBuilder{
  type T = this.type
  def append(str : String) : T = ...
}

abstract class StringBuilder{
  //already defined by AbstractStringBuilder return type is StringBuilder
}

)


另一种方法也较慢,因为需要进行类型转换。 - Peter Lawrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接