2017-03-17 6 views
0

私は.close()メソッドで完成したカスタムクラスを作成しました。オブジェクトを適切に閉じて、使用しているリソースを解放するために、オブジェクトを使用した後でクライアントがこのメソッドを常に呼び出すようにするにはどうすればよいでしょうか?クライアントにオブジェクトを閉じるように強制する

すなわち: 私はオブジェクト

public MyObject { 
    public MyObject() { 

    } 
    method1() { 
    //do some stuff. 
    } 
    method2() { 
    //do some other stuff. 
    } 
    close(){ 
    //cleans up resources utilized by this object. 
    } 
} 

があると仮定し、クライアント:

public static void main(String[] args) { 
    MyObject my = new MyObject(); 
    my.method1(); 
    my.method2(); 
    my.close(); 
} 

以上が動作するはずです。しかし、

は、オブジェクトが使用後に決して閉じられないため、機能しない(理想的にはコンパイルや警告を出さない)べきです。

+1

私はそれが可能だとは思わない(AFAIK) –

答えて

1

私は、.close()メソッドで完全なカスタムクラスを作成しました。オブジェクトを適切に閉じて、使用しているリソースを解放するために、オブジェクトを使用した後でクライアントがこのメソッドを常に呼び出すようにするにはどうすればよいでしょうか?

私はあなたのクラスがAutoClosableインターフェイスを実装し、try with resourceを使用できるようにすることをお勧めしたい:

public MyObject implements AutoCloseable{ 
    // ... 
    @Override 
    close(){ 
    //cleans up resources utilized by this object. 
    } 
} 


public static void main(String[] args) { 
    try(MyObject my = new MyObject();){ 
     my.method1(); 
     my.method2(); 
    } // calls 'close()' when leaving this block even when exception occures 
} 
+0

私はCloseableを実装しました。まだ私が望んでいたように動作します。ありがとうございました! – fuzzyblankey

0

私はコメントしたいが、私は十分な評判を持っていないので、私は答えとしてそれを書きます。

答えで説明したとおり、AutoCloseableを実装できますが、実装したくない場合は、ressourcesを開始するinit()メソッドを追加し、各メソッド本体init()を最後に始まり、終わり()。

あなたのコードは次のようになります:

public MyObject { 
    public MyObject() { 

    } 
    init() { 
     //initiate ressources. 
    } 
    method1() { 
     init(); 
     //do some other stuff. 
     close(); 
    } 
    close(){ 
     //cleans up resources utilized by this object. 
    } 
} 

しかし、パフォーマンスが重要な要因であるならば、AutoCloseableを実装するために良いはずです。

関連する問題