为什么 PrintStream::printf return 是 PrintStream?

Why does PrintStream::printf return a PrintStream?

PrintStream 的 printf 方法有一个 return 类型的 PrintStream 并且每次调用它时都会 returns 这个对象(其他打印方法无效)。那么为什么要这样设计呢?就此而言,如果您有一个任何类型的对象,该对象具有 return 对象本身的方法,那有什么意义呢?您已经拥有该对象(特别是这个对象)。 那么为什么 return 这个对象?

返回当前对象的主要目的是启用所谓的流畅API,这使得调用链成为可能:

object.method(arg).otherMethod(arg2).yetOtherMethod(arg3)

这种样式更常用于 builder/factory 类,但在其他类型的 类 上也很常见。

它被称为fluent interface。它的设计使您可以像这样将调用链接在一起:

stream.printf("aaaa")
      .printf("bbbb")
      .printf("cccc");

而不是做:

stream.printf("aaaa");
stream.printf("bbbb");
stream.printf("cccc");

通过在方法的最后返回this来实现:

class PrintStream extends FilterOutputStream implements Appendable, Closeable {
    //...

    public PrintStream printf(String var1, Object... var2) {
        return this.format(var1, var2);
    }

    public PrintStream format(String var1, Object... var2) {
        //...
        return this; // <-- here
    }
    //...
}

至于在这种情况下它是否是一个好的设计模式,我想说不是特别好。也不是很糟糕。

return voidprint() 方法是 legacy/original 在 PrintStream.

的第一个发布版本中定义的方法

同时 PrintStream printf(String format, Object ... args)PrintStream printf(Locale l, String format, Object ... args) 稍后在 PrintStream.
中介绍(更具体地在 Java 5 中) 开发人员可能决定引入流畅的方法来简化其使用,例如:

ps.print("Hello %s", oneString)
  .print("Hello %s", otherString);

由于开发人员不会通过重构现有方法(用流畅的方法替换void)来破坏 class 的 API,我们现在得到它们的混合。
这些新方法很好,但不幸的是导致不一致 API :大多数打印方法 return void 并且只有两个(可能是不太常见的用途的一部分)是流畅的。