如何在Java中创建自定义Reader类

时间:2016-05-01 13:22:43

标签: java wrapper decorator java-io

我希望通过继承CustomReader类来创建我的java.io.Reader类。我的CustomReader将包围另一个BufferedReader,其中读取了实际输入,并从中添加了我自己的输入翻译并返回给我的调用者。 (它被称为装饰器模式吗?)

javadoc表示只有close类的read(char[] cbuf, int off, int len)Reader是抽象方法,但其他方法则不是。{1}}类。但是,从java.io.Reader继承的其他非抽象方法,我可以期待什么样的默认实现呢?例如,如果某人调用从read()类继承的Reader,是否会调用我的read(char[] cbuf, int off, int len)实现来获取输入?另外,标准Reader的{​​{1}}方法如何确定其返回值?因为它不是抽象的,我不需要提供实现。

我是否真的需要将所有继承的方法从ready()转发到Reader我环绕 - 是抽象还是不抽象?

1 个答案:

答案 0 :(得分:0)

  

从java.io.Reader继承的其他非抽象方法可以期待什么样的默认实现?

如果您覆盖的方法也尊重合同,您可以期望在javadoc中遵守合同的实现。

  

例如,如果有人调用继承自Reader类的read(),它会调用我的read(char [] cbuf,int off,int len)来实现输入吗?

是。这是read()的实现:

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

标准Reader的ready()方法如何确定其返回值?

它总是返回false。

  

我是否真的需要将所有继承的方法从Reader转发到我带回的BufferedReader

你需要确保他们按照自己的意愿行事。但是因为他们已经委托给你自己委托给包装读者的抽象方法的实现,所以可能没有必要覆盖它们。

我的建议:请不要犹豫,阅读Reader的源代码。并为自定义阅读器的所有方法(包括或未继承)编写单元测试。