为什么 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 void
的 print()
方法是 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
并且只有两个(可能是不太常见的用途的一部分)是流畅的。
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 void
的 print()
方法是 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
并且只有两个(可能是不太常见的用途的一部分)是流畅的。