【问题标题】:How to Create a Custom Reader Class in Java如何在 Java 中创建自定义阅读器类
【发布时间】:2016-08-26 07:35:09
【问题描述】:

我想通过继承java.io.Reader 类来创建我的CustomReader 类。我的CustomReader 将环绕另一个BufferedReader,读取实际输入,并从中添加我自己的输入翻译并返回给我的调用者。 (是不是叫装饰器模式?)

javadoc 说只有Reader 类的closeread(char[] cbuf, int off, int len) 是抽象方法,但其他不是。但是我可以从java.io.Reader 继承的这些其他非抽象方法中期望什么样的默认实现?例如,如果有人调用我的read(),它是从Reader 类继承的,它会调用我的read(char[] cbuf, int off, int len) 实现来获取输入吗?另外,标准Readerready() 方法如何确定其返回值?由于它不是抽象的,我不必提供实现。

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

【问题讨论】:

    标签: java wrapper decorator java-io


    【解决方案1】:

    我可以从 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 的源代码。并为自定义阅读器的所有方法(无论是否继承)编写单元测试。

    【讨论】:

    • 覆盖然后委托是更安全和更好的建议。没有?
    • 委派给什么?如果您委托给自己的 read(char[] cbuf, int off, int len) 方法,那么您的实现与 Reader 中的实现相同。如果您委托给包装的阅读器,那么您的自定义阅读器将不再添加任何自定义行为。但是,在不知道您的自定义阅读器应该做什么的情况下讨论最佳方法是毫无意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2016-10-28
    • 2013-08-25
    • 2011-10-19
    • 2011-10-19
    • 2018-04-14
    • 2011-06-23
    相关资源
    最近更新 更多