为什么FilterOutputStream是一个具体的类?

时间:2016-09-07 10:13:14

标签: java decorator outputstream

Java的FilterOutputStream是Java中Stream装饰器模式的一部分。它是中间的基础装饰器类。

来自文档:

  

FilterOutputStream类本身只是覆盖了所有方法   OutputStream,其版本将所有请求传递给基础   输出流。 FilterOutputStream的子类可以进一步覆盖   其中一些方法以及提供其他方法和   字段。

我的学生问我为什么这门课程具体,而且我很难找到一个很好的理由。这只是一个疏忽吗?

有什么想法吗?

3 个答案:

答案 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对您的用户应尽可能地弱(即尽可能少地限制其使用)。强迫用户以某种方式写出来并不是你的任务,因为在你没有想到的情况下它可能会妨碍用户。