Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么PrintStream::printf返回PrintStream?_Java_Return_Printstream - Fatal编程技术网

Java 为什么PrintStream::printf返回PrintStream?

Java 为什么PrintStream::printf返回PrintStream?,java,return,printstream,Java,Return,Printstream,PrintStream的printf方法的返回类型为PrintStream,每次调用它时都返回此对象(其他print方法为void)。那么为什么它是这样设计的呢?对于这个问题,如果你有一个任何类型的对象,它有一个返回对象本身的方法,那有什么意义呢?您已经拥有该对象(特别是该对象)。 那么为什么要返回这个对象呢?返回当前对象的主要目的是启用所谓的fluent API,这使得调用链接成为可能: object.method(arg).otherMethod(arg2).yetOtherMethod(a

PrintStream的printf方法的返回类型为PrintStream,每次调用它时都返回此对象(其他print方法为void)。那么为什么它是这样设计的呢?对于这个问题,如果你有一个任何类型的对象,它有一个返回对象本身的方法,那有什么意义呢?您已经拥有该对象(特别是该对象)。
那么为什么要返回这个对象呢?

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

object.method(arg).otherMethod(arg2).yetOtherMethod(arg3)
这种样式更常用于builder/factory类,但在其他类型的类中也很常见。

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

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
    }
    //...
}
类PrintStream扩展FilterOutputStream实现可追加、可关闭{
//...
公共PrintStream printf(字符串var1,对象…var2){
返回此.format(var1,var2);
}
公共打印流格式(字符串var1,对象…var2){
//...
返回此;//返回
void
print()
方法是在第一个发布版本的
PrintStream
中定义的遗留/原始方法

PrintStream printf(字符串格式、对象…参数)
PrintStream printf(语言环境l、字符串格式、对象…参数)
后来在
PrintStream

开发人员可能决定引入fluent方法以简化其使用,例如:

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