Java的FilterOutputStream是Java中Stream装饰器模式的一部分。它是中间的基础装饰器类。
来自文档:
FilterOutputStream类本身只是覆盖了所有方法 OutputStream,其版本将所有请求传递给基础 输出流。 FilterOutputStream的子类可以进一步覆盖 其中一些方法以及提供其他方法和 字段。
我的学生问我为什么这门课程具体,而且我很难找到一个很好的理由。这只是一个疏忽吗?
有什么想法吗?
答案 0 :(得分:2)
从技术上讲,它不一定是abstract
,但如果你从严格的OO观点来看它,那就是疏忽,是的。
没有意义实例化普通FilterOutputStream
,这是抽象类的教科书定义。实际上,Javadoc将其说得更清楚,将此类的目的定义为:
此类是过滤输出的所有类的超类 流。这些流位于已存在的输出流之上 (基础输出流),它用作它的基本接收器 数据,但可能会沿途改变数据或提供数据 附加功能。
由于其唯一目的是作为其他实现的超类,因此将其标记为abstract
将不仅仅是合理的。
故事的寓意是,仅仅因为它是一个java.*
类,它并不意味着它是好的OO。有很多妥协的例子,有时甚至是完全糟糕的设计,其中一些更糟糕。
答案 1 :(得分:1)
我认为FilterOutputStream
充当抽象OutputStream
类的骨架实现,提供最小的实现。之后,扩展它的每个类将仅覆盖与原始实现不同的方法。我认为类似的类就像AbstractList,提到它是抽象的,因为你需要实现一些方法。 FilterOutputStream不需要声明为abstract,因为它实现了OutputStream
中唯一的抽象方法 - write()
由于它不是抽象的,你可以这样做:
FilterOutputStream stream = new FilterOutputStream(System.out);
stream.write(65);
stream.flush();
stream.close();
这将在System.out流上打印字符A,但它可以与其他输出流一起使用。
答案 2 :(得分:0)
考虑反过来说:“为什么它应该是抽象的,什么时候实现所有方法,而且没有抽象方法?”
所有方法都已实现,没有一个是抽象的,那么为什么它应该是一个抽象类,当它完全实现时呢?
为什么API的用户强制要为类创建子类,给用户带来额外的不必要负担?如果用户在几乎没有内存的JVM中工作,并且每个字节(即类定义)都很重要怎么办?通过使其抽象化可以存在具体的物理问题,而仅通过使其不抽象而产生风格问题。
您的API对您的用户应尽可能地弱(即尽可能少地限制其使用)。强迫用户以某种方式写出来并不是你的任务,因为在你没有想到的情况下它可能会妨碍用户。