2016-11-15 2 views
1

Javaクラスの中には、インスタンス変数として宣言されたIOリソースが複数のメソッドで使用されているものがあります。彼らはそれが推奨されていないとも言います。これに対してより良いアプローチがあるかどうかは分かりますか? 例:close IOリソースがインスタンス変数として宣言されていることをお勧めします

public class test{ 
     private PrintWriter writer=null; 
     public test(){ 
     createWriter(); 
} 
     public void log(){ 
     writer.write("test"); 
     writer.flush(); 
     } 
     public void createWriter(){ 
     writer=new PrintWriter(new BufferedWriter(new FileWriter("file"))); 
     } 
    } 
+4

それを閉じますかのを見ることができるように他のStreamsとWritersをラップするすべての標準のStreamsとWritersのように:クラスをCloseableに実装するようにして、try-with-resourcesステートメントで自動的に呼び出すことができるclose()メソッドがあります。もちろん、それを文書化してください。 –

+0

ありがとうございます!この問題は、大きなコードベースを持つ既存のプロジェクトからのものです。オブジェクトが作成されているところでどこでも変更したり(try-withを追加する必要があります)、これを変更せずに閉じることができる他の方法がありますクラス。 – Saikiran

+0

try-with-resourcesステートメントを使用する必要はありません。代わりに、finallyブロックで閉じることです。しかし、コードを変更せずにコードをclose()することは魔法のようにできます。 –

答えて

0

デストラクタのいくつかの種類があることshoud。たとえばjunitでは(クラスの名前を "test"としています)、アノテートされたメソッドでクリーンアップを行う@AfterClassアノテーションがあります。

0

使用後は手動で閉じるだけです。

public class PrintWriterDemo { 
private PrintWriter writer; 
public PrintWriterDemo() { 
    writer = new PrintWriter(System.out); 
} 
public void log(String msg) { 
    writer.write(msg + "\n"); 
    writer.flush(); 
} 

public void close() { 
    System.out.println("print writer closed."); 
    writer.close(); 
} 

public static void main(String[] args) { 
    PrintWriterDemo demo = new PrintWriterDemo(); 
    demo.log("hello world"); 
    demo.close(); 
} 

}

1

あなたのクラスで実装しAutoCloseableclose()メソッドをオーバーライドして、このclose()方法では、すべてのIO関連のリソースを閉じます。

Java 7を使用している場合、tryリソースを使用してクラスへの参照を作成することができ、JVMはクラスのcloseメソッドを自動的に呼び出します。

あなたは、FilterReaderクラスのコードに

public abstract class FilterReader extends Reader { 
    protected Reader in; 
    //......Other code, and then 
    public void close() throws IOException { 
     in.close(); 
    } 
} 

そして、あなたは

try(FileReader fr = new FileReader("filename")){ 
    // your code 
} 

を書いて、あなたが行われているJVMが自動的に私はやるだろう

関連する問題