为什么PrintStream :: printf返回一个PrintStream?

时间:2018-06-22 15:59:13

标签: java return printstream

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

3 个答案:

答案 0 :(得分:4)

它称为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
    }
    //...
}

关于在这种情况下这是否是一种好的设计模式,我不会特别指出。进攻方面也不错。

答案 1 :(得分:3)

返回当前对象的主要目的是启用称为 fluent API 的功能,这使得调用链接成为可能:

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

这种样式更常用于生成器/工厂类,但在其他类型的类上也很常见。

答案 2 :(得分:1)

返回print()的{​​{1}}方法是在void的第一个发行版本中定义的旧方法/原始方法。

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

PrintStream

由于开发人员不会通过重构现有方法(用流利的方法替换ps.print("Hello %s", oneString) .print("Hello %s", otherString); )来破坏类的API,因此我们现在将它们混合在一起。
这些新方法很好,但不幸的是,结果导致API不一致:大多数打印方法返回void,只有两个(可能是较不常用的一部分)可以使用。