2016-11-24 6 views
-1

私は、コンストラクタでファイルを開くクラスを持っており、メソッドの呼び出し中にファイルに書き込みます。どこでファイルを閉じるのですか? クラスはメソッドが1つしかない一般的なインターフェイスを実装しています。パブリックメソッドは追加しません。javaファイルが確実にクローズされるようにする方法

public interface I { 
    void makeChange(); 
} 

public class C implements I { 
    FileWriter f; 
    PrintWriter p; 
    public C() { 
     f = new FileWriter("log.txt"); 
     p = new PrintWriter(p); 
    } 
    @Override 
    public void makeChange() { 
     p.println("something"); 
     p.flush(); 
    } 
} 

パブリックメソッドendChanges()を追加することはできません。

また、クラスは変更がいつ終了するかを知ることができません。

私はConstructorとmakeChange()の動作を変更することを許可されています。

私はfinalize()を試みましたが、実行さえしませんでした。

EDIT。 インターフェイスIは、多くのクラスによって実装されています。 ファイルのうちのいくつかはファイルを必要としないため、closeFile()メソッドは必要ありません。

目標は、すべての実装のために同じコードの実行を作ることです。publicメソッドendChanges()を追加できないように

public static void main(String args[]) { 
     I c1 = new C(); 
     c1.makeChange(); 
     I c2 = new D(); // D is an implementation of I that doesn't handle a file 
     c2.makeChange(); 
} 
+0

なぜあなたは 'endChanges()'を追加できません –

+0

なぜp&f.close()をmakeChange()に追加できませんか? – developer

+0

は、makeChange()が複数回呼び出されることを意図しています。 ?そうでなければtryと最後に囲み、そして最後にあなたは閉じることができます。 –

答えて

2

デザインは、本質的に間違っていると、この正しい方法をやってからあなたを防ぐことができます。

これが何らかの宿題やクイズ(またはそれでもなおクイズ宿題)の場合は、「正しい」答えはおそらくfinalize()を使用している可能性があります。しかし、あなたが気づいたように、このメソッドは実行されないこともあります(たとえば、JVMがオブジェクトを解放する前に停止している場合など)。その単純なケースでは、同じ時間にファイルを閉じるので問題ありませんが、通常は実行した理由のために、通常finalize()の使用をお勧めしません。


正しいアプローチはCloseableインタフェースを実装して行った場合に起動するユーザのclose()方法を提供するクラスのためのものです。ファイルのオープンとクローズの間に複数の呼び出しをファイルに対して実行したいので、これが標準的なアプローチです。

(追加するには編集済み):複数の実装があり、その中にはクリーンアップロジックが必要なものもあれば、そうでないものもありますが、ユーザーがコールする必要があるクリーンアップ(閉じる)いくつかの実装は空のままです。


ユーザーがファイルを閉じることを忘れていない、絶対に確認する必要がある場合は、あなたがinstaed、ファイルに対して実行するコールバックを受け入れるdoWithFile()メソッドを作成することもできますが、ファイルを開き、その後閉じをコールバックを行い、ファイル。

関連する問題