Java中文件的nullobject
我有一个类,对于Java中文件的nullobject,java,design-patterns,file,null,mocking,Java,Design Patterns,File,Null,Mocking,我有一个类,对于File对象,它偶尔会传递null。在正常操作期间,它使用扫描器类解析文件 我想我可以用nullobjects(四人帮风格)替换文件,而不是用null检查文件对象,而不是乱扔代码 然而,看起来文件并不是真正为扩展而设计的。有人对如何执行此操作有任何指示吗?为什么您不能直接控制文件对象进入程序逻辑的入口点,并在那里执行null检查 另一种选择是使用类似于封装数据的单独接口的东西:例如读取器。您当然可以提供一个NullReader实现空对象模式是围绕接口设计的,而不是具体的对象 为了
File
对象,它偶尔会传递null
。在正常操作期间,它使用扫描器
类解析文件
我想我可以用nullobjects(四人帮风格)替换文件,而不是用null
检查文件
对象,而不是乱扔代码
然而,看起来文件
并不是真正为扩展而设计的。有人对如何执行此操作有任何指示吗?为什么您不能直接控制文件
对象进入程序逻辑的入口点,并在那里执行null
检查
另一种选择是使用类似于封装数据的单独接口的东西:例如读取器
。您当然可以提供一个NullReader
实现空对象模式是围绕接口设计的,而不是具体的对象
为了解决这个问题,您可以创建一个新的界面,其中包含您从文件中使用的方法,然后创建一个具体的实现,该实现只委托给内部保存的文件。然后,您可以创建null实现,它将清除调用
当然,删除一个空检查似乎有点过分。您可以将使用该文件的对象替换为空对象
例如,您可以使用NullInputStream并将其传递给扫描仪
之前:
public void whatever( File f ) {
Scanner scanner = new Scanner( f );
...
}
之后
并将该方法实现为:
private final InputStream getInputStreamFrom( File f ) {
if( f == null && !f.exists() ) {
return NullInputStream.instance;
}
return new InputStream( new FileInputStream( f ) );
}
class NulllInputStream extends InputStream {
private final static NullInputStream instance = new NullInputStream();
private NullInputStream() {
}
public int read() {
return -1;
}
.... other relevant methods here...
}
显然,编码很仔细,而不是在3分钟内。正如我所做的:):):)你说它不是为了扩展而设计的是什么意思?我的意思是“用一个具有相同接口的完全不同的实现来取代设计”。Apache Commons中甚至有这样一个实现:
private final InputStream getInputStreamFrom( File f ) {
if( f == null && !f.exists() ) {
return NullInputStream.instance;
}
return new InputStream( new FileInputStream( f ) );
}
class NulllInputStream extends InputStream {
private final static NullInputStream instance = new NullInputStream();
private NullInputStream() {
}
public int read() {
return -1;
}
.... other relevant methods here...
}