File
オブジェクトの場合は、時折受け取るクラスがあります。null
通常の操作では、Scanner
クラスを使用してファイルを解析します。Javaのファイル用のnullobject
File
オブジェクトに対してnull
個のチェックを行う代わりにFile
をnullobjects(Gang of Fourスタイル)に置き換えることができると考えました。
しかし、File
は実際には拡張されていないようです。どのようにこれを行うにはどのような指針を持っていますか?
File
オブジェクトの場合は、時折受け取るクラスがあります。null
通常の操作では、Scanner
クラスを使用してファイルを解析します。Javaのファイル用のnullobject
File
オブジェクトに対してnull
個のチェックを行う代わりにFile
をnullobjects(Gang of Fourスタイル)に置き換えることができると考えました。
しかし、File
は実際には拡張されていないようです。どのようにこれを行うにはどのような指針を持っていますか?
あなたが例えば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分で、慎重にではなくコード化されました。私がした:) :)
Apache Commonsにもこの実装があります:http://commons.apache.org/io/apidocs/org/apache/commons/io/input/NullInputStream.html – Ryan
File.existsは無用です。 –
File
オブジェクトのエントリポイントをプログラムのロジックに制御して、null
のチェックを実行できないのはなぜですか?
別のオプションは、データをカプセル化する別のインターフェイスのようなものを使用することです。たとえば、Reader
です。あなたは確かにNullReader
の実装を提供することができます
ヌルオブジェクトパターンは、具体的なオブジェクトではなくインターフェイスを中心に設計されています。
この問題を回避するには、File
から使用しているメソッドを含む新しいインターフェイスを作成してから、File
を内部に保持する具体的な実装を作成します。次に、ヌル実装を作成して、呼び出しをスタブします。
もちろん、これは1つのヌルチェックを削除するための少し残忍なようです。
あなたはそれが拡張するように設計されていないという意味ですか? – hhafez
私が言ったのは、「デザインは、同じインターフェースで全く異なる実装に置き換えられる」ということでした。 – Ryan