Какая польза от PrintWriterPrinter в Android?
Во время исследований в базе данных 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. Мой вопрос: зачем мне использовать этот бесполезный PrintWriterPrinter, если я могу просто вручную вызвать println для моего объекта PrintWriter вместо создания PrintWriterPrinter, а затем вызвать println для этого (который затем вызывает println для PrintWriter)?
2 ответа
Ключ implements Printer
,
Когда вы изучили программирование на Java, вы узнали об интерфейсах на Java. Класс объявляет, что он реализует интерфейс через implements
ключевое слово; PrintWriterPrinter implements Printer
указывает на то, что PrintWriterPrinter
реализует Printer
интерфейс.
Если вы посмотрите на Printer
интерфейс в JavaDocs, вы увидите, что он определяет этот единственный println()
метод. Однако, если вы посмотрите внимательно, вы увидите, что в JavaDocs перечислены четыре реализации этого интерфейса: LogPrinter
, PrintStreamPrinter
, PrintWriterPrinter
, а также StringBuilderPrinter
,
Через то, что известно как полиморфизм, другой код может работать с объектом, известным для реализации Printer
интерфейс - вызов println()
на этом объекте - не зная или не заботясь о том, какая из этих четырех реализаций находится за этим объектом. Другие разработчики могут создавать еще другие реализации Printer
интерфейс (например, тот, который хранит последние 50 строк в ArrayList
), а остальная часть фреймворка нуждается в Printer
может использовать эту пользовательскую реализацию без проблем.
Возможно, скрыть некоторые методы в PrintWriter для предполагаемого использования, например методы flush/close?