Я также хочу знать, является ли это хорошей практикой разработки программного обеспечения, поскольку я не видел, чтобы объекты с буферизованным ридером использовались в конструкторах так часто, когда я пытался найти его
скажем, что это нехороший дизайн - принципиально объединять «проблемы» парсинга и конструирования в API.Это особенно важно, если класс универсальный;то есть тот, который может быть использован / повторно использован в разных контекстах.
Однако, при условии, что такой конструктор действительно является «перегрузкой удобства» для других более фундаментальных методов / конструкторов API, которые выполняют задачи конструирования и анализа, в этом нет ничего плохого:
public Foo(Reader reader) {
this();
this.load(reader);
}
public Foo() {
...
}
public void load(Reader reader) {
...
}
Я бы использовал Reader
вместо BufferedReader
в качестве типа аргумента.В некоторых случаях использования не требуется буферизация BufferedReader
, и если ваш класс использует ограниченные возможности синтаксического анализа BufferedReader
, вам не следует раскрывать детали реализации в своих методах API ...равны.(Но прагматика может диктовать иное.)
Если вам нужно использовать BufferedReader для внутреннего использования, и вас беспокоит (небольшая) стоимость ненужного фильтра в выходной цепочке, сделайте следующее:
public void load(Reader reader) {
BufferedReader br = (reader instanceof BufferedReader) ?
(BufferedReader) reader : new BufferedReader(reader);
}
Ваш обновленный пример:
Аппаратно подключен System.in
или имя файла в классе - плохой дизайн.Это делает код слишком негибким.Простое изменение конфигурации для чтения данных из другого места повлечет за собой изменение кода ... и, возможно, поиск кода, чтобы найти все другие места, где пути и т. Д. Были жестко запрограммированы.