在Android开发人员数据库中进行研究期间,我偶然发现了PrintWriterPrinter(位于android.util内部):
https://developer.android.com/reference/android/util/PrintWriterPrinter.html
下面显示了PrintWriterPrinter类的源代码:
package android.util;
import java.io.PrintWriter;
/**
* Implementation of a {@link android.util.Printer} that sends its output
* to a {@link java.io.PrintWriter}.
*/
public class PrintWriterPrinter implements Printer {
private final PrintWriter mPW;
/**
* Create a new Printer that sends to a PrintWriter object.
*
* @param pw The PrintWriter where you would like output to go.
*/
public PrintWriterPrinter(PrintWriter pw) {
mPW = pw;
}
public void println(String x) {
mPW.println(x);
}
}
如您所见,它只有一个方法:println(String x),它实际上将println应用于传递的PrintWriter。
我的问题:如果我可以只在我的PrintWriter对象上手动调用println而不是创建一个PrintWriterPrinter,然后在该对象上调用println(然后在PrintWriter上调用println),那么为什么要使用这个无用的PrintWriterPrinter?
最佳答案
密钥是implements Printer
。
学习Java编程时,您了解了Java interfaces。一个类声明通过implements
关键字实现一个接口; PrintWriterPrinter implements Printer
表示PrintWriterPrinter
实现Printer
接口。
如果查看JavaDocs中的Printer
接口,您将看到它定义了唯一的println()
方法。但是,如果仔细看,您会发现JavaDocs列出了该接口的四个实现:LogPrinter
,PrintStreamPrinter
,PrintWriterPrinter
和StringBuilderPrinter
。
通过所谓的polymorphism,其他代码可以与已知实现Printer
接口的对象一起工作(在该对象上调用println()
),而无需知道或关心这四个实现中的哪个位于该对象的后面。其他开发人员可以创建Printer
接口的其他实现(例如,将最后50行存储在ArrayList
中的实现),而其他需要Printer
的框架可以使用该自定义实现而不会出现问题。