Почему Throwable.printStackTrace принимает PrintWriter вместо Writer?
Почему public void printStackTrace(PrintStream s)
в классе Throwable взять PrintWriter вместо Writer?
Я думаю, что Writer должен быть нормой (код интерфейса, а не конкретная реализация), но это может быть что-то, что я пропускаю, отсюда и этот вопрос.
2 ответа
Решение
Writer
это абстрактный класс, который PrintWriter
продолжается. Throwable.printStackTrace
занимает PrintWriter
потому что это вызывает println
метод, который недоступен в Writer
учебный класс.println
вызывается потому, что нужно напечатать трассировку стека, один кадр стека на строку.
Там может быть несколько причин
- Первоначальной реализацией было использование PrintStream, а улучшенной версией является PrintWriter.
- Метод печатает строки текста, и хотя он может создавать PrintWriter по требованию, это не идеально.
То, что они могли бы сделать, это принять Appendable, который является родителем Writer, как это.
public void printStackTrace(Appendable appendable) {
PrintWriter pw = (appendable instanceof PrintWriter) ? (PrintWriter) appendable :
(appendable instanceof Writer) ? new PrintWriter((Writer) appendable) :
new printWriter(new AppendableWriter(appendable));