В процессе обучения Java я нашел (и поспешно использовать в своем коде) следующий образец кода из JDK:Как Formatter работает с BufferedWriter без закрытия?
public Formatter(OutputStream os, String csn, Locale l)
throws UnsupportedEncodingException
{
this(l, new BufferedWriter(new OutputStreamWriter(os, csn)));
}
Он проходит вновь созданный BufferedWriter
к other constructor со ссылкой на него в качестве Appendable
интерфейса (так что не может быть дополнительно продувают или закрытым в Formatter
реализации):
private Formatter(Locale l, Appendable a) {
this.a = a;
this.l = l;
this.zero = getZero(l);
}
После некоторого мышления и выкапывания BufferedWriter
код, я не могу понять, как это может работать должным образом - от BufferedWriter
код выглядит так, что он потеряет буферизованные данные, если не закрыт, когда это будет сделано. Метод Finalize
, по-видимому, не используется. В классе Formatter
есть куча других конструкторов, которые используют BufferedWriter
аналогичным образом (в основном, обертывание выходных потоков и файлов). Итак, как работает промывка буфера в этом коде? Или это куча ошибок в JDK (что звучит для меня невероятно, так как это очень простая и старая функциональность)?
Спасибо, теперь я понимаю. Мне показалось, что если мы сохранили ссылку только через интерфейс Appendable, то мы не сможем вызвать на нем функцию close(). Полностью забыл о экземпляре магии и возможности выбора типов. – vagran