我最近在面试中被问到了这个问题,但我无法回答。那么,在java.io中最常用的模式是什么,它是如何使用的?常见的Java库还使用了哪些其他模式?
我最近在面试中被问到了这个问题,但我无法回答。那么,在java.io中最常用的模式是什么,它是如何使用的?常见的Java库还使用了哪些其他模式?
BufferedReader
等实现了装饰器模式。任何Reader
,例如FileReader
或StringReader
,都可以使用缓冲功能进行装饰,这是真正的源无关性。
除了其他人所说的,以下是Java库中的几个反模式:
来自《Effective Java第二版,项目16:偏爱组合而非继承》:
在Java平台库中有许多明显违反此原则的情况。例如,栈不是向量,因此
Stack
不应该扩展Vector
。同样,属性列表不是哈希表,因此Properties
不应该扩展Hashtable
。在这两种情况下,组合会更好。
来自Effective Java第二版,第19条:仅使用接口定义类型:
Java平台库中有几个常量接口,例如
java.io.ObjectStreamConstants
。这些接口应被视为异常情况,不应模仿。
来自《Effective Java第2版,第2项:面对许多构造函数参数时,请考虑使用构建器》(在线摘录):
传统上,程序员使用望远镜构造函数模式,在其中提供仅包含所需参数的构造函数,另一个带有单个可选参数,第三个带有两个可选参数,依此类推[...] 望远镜构造函数模式是有效的,但是当存在许多参数时,编写客户端代码很难,并且更难编写。
当您面临许多构造函数参数时,第二种选择是JavaBeans模式,在其中调用不带参数的构造函数以创建对象,然后调用设置器方法来设置每个必需参数和每个感兴趣的可选参数。[...]不幸的是,JavaBeans模式本身也有严重的缺点[...] JavaBean可能在其构建过程中处于不一致状态 [而且]排除了使类成为不可变的可能性。
Bloch建议改用构建器模式。
Java.io包中使用的模式。
示例:
抽象类java.io.FilterInputStream及其具体子类:BufferedInputStream,CheckedInputStream
等
示例:
抽象类InputStream及其具体子类:ByteArrayInputStream,FileInputStream,FilterInputStream
等。
InputStream input = new FileInputStream("some_file.txt");
以下类使得可以从字节数组、文件、网络连接、持久存储、管道、字符串等统一读取输入:
class java.io.InputStream
class java.io.ByteArrayInputStream
class java.io.FileInputStream
class java.io.FilterInputStream
class java.io.ObjectInputStream
class java.io.PipedInputStream
class java.io.SequenceInputStream
class java.io.StringBufferInputStream
示例:
java.io.InputStreamReader
将字节流转换为字符流,而java.io.OutputStreamWriter
将字符流转换为字节流。
java.io.InputStream,java.io.OutputStream,java.io.Reader和java.io.Writer
的所有非抽象方法。
对于Java中的所有其他模式,请参阅此帖子: