Я хотел бы написать код Java (скажем, метод), который будет печатать несколько строк.
Объект, на который нужно напечатать, должен быть предоставлен вызывающей стороной.Мне бы хотелось, чтобы мой код не заботился о том, что именно является этим объектом, и просто вызывал методы println()
или println(String)
этих объектов.Он должен работать независимо от того, является ли этот объект java.io.PrintStream
(например, System.out
) или java.io.PrintWriter
(например, созданный вызывающей стороной с new PrintWriter(System.out)
или new PrintWriter(new ByteArrayOutputStream())
).
Это было бы легко, если быПотенциальные классы «printlineable» объекта будут совместно использовать некоторый интерфейс, который предписывает методы println()
и println(String)
.Однако они этого не делают.
Итак, что я помещаю в подпись, чтобы получить такой объект, не нарушая принцип DRY , дважды написав, что по сути является той же реализацией, только с заменойтипы (как это было бы при простой перегрузке функции)?
public void sayHello( ??? outThingy) {
outThingy.println("Hello World");
outThingy.println();
// This just a minimal example.
// The real implementation might be more involved
// and non-trivial, so that avoiding duplication
// becomes a real concern.
};
// sayHello should be usable like this:
sayHello(System.out);
// but also like this:
baos = new ByteArrayOutputStream();
pw = new PrintWriter(baos)
sayHello(pw);
pw.flush();
System.out.println(baos.toString());
Или тот факт, что PrintStream
и PrintWriter
не используют такой интерфейс, следует рассматривать как указание на то, что они не 't взаимозаменяемы в отношении предоставления способа печати строк?(Вместо того, чтобы быть каким-то историческим упущением, когда эти классы были указаны.)