2014-09-03 2 views
-1

Я немного смущен следующей вещи:Кастинг для читателя или создания нового читателя

public randomConstructor(Reader r) { 
    this.bufferedreader = new BufferedReader(r); 
} 

Казалось логичным, что если вы хотите использовать BufferedReader вы должны создать и использовать читателя в качестве параметра. Тем не менее, я увидел что-то вроде этого:

public randomConstructor(Reader r) { 
    this.bufferedreader = (BufferedReader) r; 
} 

Obivously он не работает, если г не является само по себе BufferedReader.

Извините, если я не могу дать вам лучший пример, но я помню, что был пример, когда на самом деле имеет смысл бросить его читателю. Есть ли какое-либо исключение, где это имеет смысл?

EDIT: BufferedReader, очевидно, является частной переменной типа «BufferedReader» :)

+0

Кастинг в этом случае довольно опасен, так как вы открываете себя до класса ClassCastException. Если вы знаете, что вам понадобится «BufferedReader», вам всегда будет лучше, если тип параметра отражает это или создаст его самостоятельно, как в первом примере. – azurefrog

+0

@azurefrog Я вижу, поэтому в конце дня это просто глупая идея, верно? – Goldi

+0

@DennisvonEich A. «Читатель» не должен быть «BufferedReader» и B. У вас не должно быть конструктора с объектом для чтения (например, Streams). Лучше использовать источник для чтения. – Hannes

ответ

1

Выполнения непроверенного броска всегда опасно и следует избегать.

Первый конструктор - хороший пример использования шаблона, который называется Decorator. BufferedReader украшает пройденный объект Reader. Если вы разрабатываете класс, который будет использоваться в любом виде Reader, и их много, вы можете легко обернуть этот читатель с помощью BufferedReader и получить преимущества буферизации с преимуществами полиморфного конструктора.

Единственный случай, когда он может иметь смысл, если входящий конструктор уже является BufferedReader. Обернуть его другим BufferedReader, вероятно, не нужно. В этом случае, вы могли бы выполнить проверку instanceof как следующее:

public randomConstructor(Reader r) { 
    if (r instanceof BufferedReader) { 
     this.bufferedreader = (BufferedReader) r; 
    } else { 
     this.bufferedreader = new BufferedReader(r); 
    } 
} 

В качестве альтернативы, вы можете также предоставить перекрытый конструктор, который ожидает в BufferedReader в дополнение к тому, что ожидает Reader.

0

Я изо всех сил и не мог найти сценарий, в котором вы знаете, что r имеет тип BufferedReader, но все еще есть хороший повод для передайте его как Reader.

Что бы больше смысла (для меня) это уже второй версии модифицированной для:

public randomConstructor(Reader r) { 
    if (r instanceof BufferedReader) { 
     this.bufferedreader = (BufferedReader) r; 
    } 
    else { 
     this.bufferedreader = new BufferedReader(r); 
    } 
} 
Смежные вопросы