2016-05-01 3 views
0

Я хочу создать свой класс CustomReader путем подкласса класса java.io.Reader. Мой CustomReader обернется вокруг другого BufferedReader, который считывает фактический ввод, и из которого мой собственный перевод ввода добавляется и возвращается моему абоненту. (Это называется рисунком Decorator?)Как создать пользовательский класс чтения в Java

В javadoc только close и read(char[] cbuf, int off, int len) класса Reader являются абстрактными методами, но другие - нет. Но какую реализацию по умолчанию я могу ожидать от этих других не абстрактных методов, унаследованных от java.io.Reader? Например, если кто-то вызовет мой read(), который унаследован от класса Reader, вызовет ли он мою реализацию read(char[] cbuf, int off, int len), чтобы получить вход? Также как метод Readerready() определяет его возвращаемое значение? Поскольку это не абстрактно, и мне не нужно обеспечивать реализацию.

Нужно ли мне пересылать все унаследованные методы от Reader до BufferedReader Обертывание - будь то абстрактным или нет?

ответ

0

Какую реализацию по умолчанию можно ожидать от этих других не абстрактных методов, унаследованных от java.io.Reader?

Вы можете рассчитывать на реализацию, которая соблюдает договор в javadoc, при условии, что методы, которые вы переопределите, также соблюдают договор.

Например, если кто-то вызывает мой read(), который унаследован от класса Reader, вызовет ли он мою реализацию чтения (char [] cbuf, int off, int len), чтобы получить вход?

Да. Вот реализация чтения():

char cb[] = new char[1]; 
    if (read(cb, 0, 1) == -1) 
     return -1; 
    else 
     return cb[0]; 

как метод стандартного читателя готов() определяет возвращаемое значение?

Он всегда возвращает значение false.

ли мне действительно нужно направить все наследуемые методы от читателя к BufferedReader я обернуть вокруг

Вы должны убедиться, что они делают то, что они должны. Но поскольку они уже делегируют вашу реализацию абстрактного метода, который сам делегирует обернутому читателю, вероятно, не будет необходимости переопределять их.

Мой совет: не стесняйтесь читать исходный код Reader. И напишите единичные тесты для всех методов, унаследованных или нет, вашего пользовательского читателя.

+0

переопределение, а затем делегирование является более безопасным и лучшим советом. Нет? –

+0

Делегирование на что? Если вы делегируете свой собственный метод read (char [] cbuf, int off, int len), то ваша реализация будет такой же, как и в Reader. И если вы делегируете обернутому читателю, то ваш пользовательский читатель больше не добавляет никакого пользовательского поведения. Но совершенно бессмысленно обсуждать лучший способ, не зная, что ваш пользовательский читатель должен делать в любом случае. –

Смежные вопросы