2017-03-28 8 views
0

Java 7のライブラリには、他のクラスにサービスするクラスがあります。つまり、サービスクラスのインスタンスを作成した後、そのメソッドの1つを複数回呼び出すことができます(たとえば、doWork()メソッド)。だから私はその仕事がいつ完了したのか分からない。しかし、サービスクラスは重いオブジェクトを使用し、それらを解放する必要があります。この部分をメソッドで設定します。例えば、release()ですが、他の開発者がこのメソッドを使用することは保証されていません。サービスクラスのタスクを完了した後、他の開発者にこのメソッドを呼び出させる方法がありますか?もちろん私はそれを記録することができますが、私はそれらを強制したいと思います。クライアントが特定のメソッドを呼び出すようにする

注:これらのオブジェクトにdoWrok()ニーズは、それが次に呼ばれたときので

私は、doWork()方法でrelease()メソッドを呼び出すことはできません。

+0

これにコードを表示できますか? – johncena

+0

@johncena申し訳ありませんが、コードは非常に長く複雑です。それはいくつかのクラスで構成されています。 – hasanghaforian

+0

次に、最善の方法は、finalizeメソッドを実装し、GC呼び出しを希望することです。ファイナライズでは、これらのオブジェクトを解放することができます。しかし、それがどう動くかは、しばしば予測可能ではありません。 – johncena

答えて

3

多くのJDKクラスが使用するのと同じメカニズムを使用できます。 close()メソッドを使用してリソースを解放し、オブジェクトの処理が完了した後にclose()にコールし、クラスにAutoCloseableclose()も指定)を実装する必要があることを明確に文書化してください。

クラスがAutoCloseableを実装した場合、あなたは

try(MyClass mc = new MyClass()) { 
    mc.doWork(); 
    mc.doMoreWork(); 
    mc.someMoreWork(); 
} catch(SomeExceptionThatMayBeThrown e) { 
    logger.log("Ooops", e); 
} 

ようにコードを書くことができますので、それは、Javaに全く新しいではありません誰にも馴染みのイディオムだし、いくつかのIDE、try-with-resources句でそれを使用することができますがしますAutoCloseableが閉じていない場合にも警告を表示します。

追加の点については、リソースをクリーンアップするfinalize()メソッドを実装できます。しかし、これは安全機構であり、明示的な終了の代わりに使うべきではありません。この全体は、たとえばFileInputStreamなどのJDKクラスがどのように実装されているかです。

0

メソッドを使用するたびにrelease()を呼び出すには、メソッドの最後にrelease()を呼び出します。

+0

私の質問を編集しました。もう一度ご覧ください。 – hasanghaforian

+0

重いオブジェクトにリソースプールを使用することをお勧めします。このようにしてdoWork()の最後にrelease()を呼び出すと、重いオブジェクトがプールに返され、それらを再び使用することができます。 – Hatem

1

あなたは(何かが最後の呼び出しであればどのようにあなたが知っているのだろうか?)があるでしょうどのように多くのコール前もってわからない場合は、人々を強制する現実的な方法はありません

あなたはいくつかの並べ替えを実行することを検討することができます新しく作成されたオブジェクトを登録し、アイドル状態になっている時間を監視する静的デーモン・スレッドの、時間制限を設定する必要があります。

1

私は釜山の答えが一般的に最も正しいと思います。

私はちょうど代替を提案しようとしています、そして、それは代わりにあなたのリリースを呼び出すために、発信者を強制的にすべてのシナリオ

には適用ソリューションではありません、あなたがして自分の仕事を入れて、開発者のためのいくつかの機能を提供します。例えば

FooService fooService = new FooService(); 
fooService.doWork(); 
System.out.println("hello"); 
fooService.doWork(); 
System.out.println("world"); 
fooService.release(); // oops, developer may forget to call this 

あなたが好きな何かをテンプレートメソッドのようなものを提供する:呼び出し側がそれを作る

new FooWorkTemplate().doSafely(s -> { 
     s.doWork(); 
     System.out.println("hello"); 
     s.doWork(); 
     System.out.println("world"); 
    }); 

ような何かを行うことができますので、

class FooWorkTemplate { 
    void doSafely(Consumer<FooService> work) { 
     FooService fooService = new FooService(); 
     work.accept(fooService); 
     fooService.release(); 
    } 
} 

を開発者が従うための規約。

関連する問題