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... 
 }