2009-07-14 3 views
1

Fileオブジェクトの場合は、時折受け取るクラスがあります。null通常の操作では、Scannerクラスを使用してファイルを解析します。Javaのファイル用のnullobject

Fileオブジェクトに対してnull個のチェックを行う代わりにFileをnullobjects(Gang of Fourスタイル)に置き換えることができると考えました。

しかし、Fileは実際には拡張されていないようです。どのようにこれを行うにはどのような指針を持っていますか?

+0

あなたはそれが拡張するように設計されていないという意味ですか? – hhafez

+0

私が言ったのは、「デザインは、同じインターフェースで全く異なる実装に置き換えられる」ということでした。 – Ryan

答えて

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分で、慎重にではなくコード化されました。私がした:) :)

+0

Apache Commonsにもこの実装があります:http://commons.apache.org/io/apidocs/org/apache/commons/io/input/NullInputStream.html – Ryan

+0

File.existsは無用です。 –

0

Fileオブジェクトのエントリポイントをプログラムのロジックに制御して、nullのチェックを実行できないのはなぜですか?

別のオプションは、データをカプセル化する別のインターフェイスのようなものを使用することです。たとえば、Readerです。あなたは確かにNullReaderの実装を提供することができます

0

ヌルオブジェクトパターンは、具体的なオブジェクトではなくインターフェイスを中心に設計されています。

この問題を回避するには、Fileから使用しているメソッドを含む新しいインターフェイスを作成してから、Fileを内部に保持する具体的な実装を作成します。次に、ヌル実装を作成して、呼び出しをスタブします。

もちろん、これは1つのヌルチェックを削除するための少し残忍なようです。

関連する問題