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