我有一个偶尔会为null
个对象传递File
的类。在正常操作期间,它使用Scanner
类来解析文件。
我认为我可以用nullobjects(Gang of Four风格)替换null
,而不是通过对File
对象进行File
检查来乱丢我的代码。
然而,File
似乎并未真正设计为扩展。有没有人对如何做到这一点有任何指示?
答案 0 :(得分:2)
您可以使用NullObject替换使用该文件的对象
例如,您可以使用NullInputStream并将其传递给扫描仪。
在:
public void whatever( File f ) {
Scanner scanner = new Scanner( f );
...
}
在
public void whatever( File f ) {
Scanner scanner = new Scanner( getInputStreamFrom( 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分钟。就像我一样:) :) :)
答案 1 :(得分:0)
为什么不能只将File
对象的入口点控制到程序的逻辑中并在那里执行null
检查?
另一种选择是使用类似于封装数据的单独接口:例如Reader
。您当然可以提供NullReader
实施
答案 2 :(得分:0)
空对象模式是围绕接口设计的,而不是具体的对象。
要解决此问题,您可以创建一个新接口,其中包含您在File
中使用的方法,然后创建一个具体实现,该实现仅委托给内部的File
。然后,您可以创建null实现,这将实现调用。
当然,这对于删除一个空检查似乎有点过分。