19

try-with-resourceが Java 7 で導入されましたが、 が に改造されていないことに驚きましLockAutoCloseable。かなり単純に思えたので、次のように自分で追加しました。

class Lock implements AutoCloseable {
    private final java.util.concurrent.locks.Lock _lock;
    Lock(java.util.concurrent.locks.Lock lock) {
        _lock = lock;
        _lock.lock();
    }
    @Override 
    public void close() {
        _lock.unlock();
    }
}

これはAutoCloseableReentrantReadWiteLockクラスで機能し、使用方法は次のとおりです。

try (AutoCloseableReentrantReadWiteLock.Lock l = _lock.writeLock()) {
    // do something
}        

これは自動クローズRAIIの非常に単純で標準的な使用に見えるので、これを行うべきではない正当な理由があるに違いないと考えています。誰か知ってる?

4

1 に答える 1

23

try-with-resourcesこれは、 2009 年 2 月または 3 月に提案されたとき、大きな議論になりました。

提案の作成者である Josh Bloch は、「この構成体は、リソース管理という 1 つのことだけを目的として設計されました。ロックのために設計されたわけではありません」と述べています。

ロックを個別にカバーする別の提案がありましたが、どこにも行きませんでした。

ロックがカバーされなかった主な理由は次のとおりだと思います。

  • Java 7 のインターフェースにメソッドを追加することはできません
  • 正しいインターフェイスを実装する追加のラッパー オブジェクトを作成することによるパフォーマンス ヒット
  • Lockファイル ハンドルとは異なる種類のリソースであることに対する哲学的な反論(たとえば、 の作成はメソッドLockの呼び出しを必要としませんlock)

このスレッドなどのアーカイブ ページで、すべての歴史的な argy-bargy をたどることができます。

于 2013-06-11T11:49:21.327 に答える