私は Java 8 の新しいラムダ機能をいじっていて、Java 8 が提供するプラクティスが本当に役立つことを発見しました。ただし、次のシナリオを回避する良い方法があるのではないかと考えています。たとえば、オブジェクト プールを埋めるためにある種のファクトリを必要とするオブジェクト プール ラッパーがあるとします ( を使用java.lang.functions.Factory
):
public class JdbcConnectionPool extends ObjectPool<Connection> {
public ConnectionPool(int maxConnections, String url) {
super(new Factory<Connection>() {
@Override
public Connection make() {
try {
return DriverManager.getConnection(url);
} catch ( SQLException ex ) {
throw new RuntimeException(ex);
}
}
}, maxConnections);
}
}
関数型インターフェースをラムダ式に変換すると、上記のコードは次のようになります。
public class JdbcConnectionPool extends ObjectPool<Connection> {
public ConnectionPool(int maxConnections, String url) {
super(() -> {
try {
return DriverManager.getConnection(url);
} catch ( SQLException ex ) {
throw new RuntimeException(ex);
}
}, maxConnections);
}
}
確かにそれほど悪くはありませんが、チェックされた例外にはラムダ内に/ブロックjava.sql.SQLException
が必要です。私の会社では、長い間 2 つのインターフェイスを使用しています。try
catch
IOut<T>
java.lang.functions.Factory
これは;と同等です。- 通常はチェック例外の伝播が必要な場合のための特別なインターフェース:
interface IUnsafeOut<T, E extends Throwable> { T out() throws E; }
.
IOut<T>
Java 8 への移行中にとの両方IUnsafeOut<T>
が削除されるはずですが、 と完全に一致するものはありませんIUnsafeOut<T, E>
。ラムダ式がチェックされた例外をチェックされていないかのように処理できる場合、上記のコンストラクターで次のように単純に使用できる可能性があります。
super(() -> DriverManager.getConnection(url), maxConnections);
それはずっときれいに見えます。ObjectPool
スーパークラスを書き直してIUnsafeOut<T>
私たちの
- に似たものを実装し
IUnsafeOut<T, E>
ますか?(正直なところ、私はそれを汚いと考えています-サブジェクトは何を受け入れるかを選択する必要があります:どちらか、Factory
または互換性のあるメソッドシグネチャを持つことができない「安全でないファクトリ」) - ラムダでチェック例外を無視するだけなので、
IUnsafeOut<T, E>
サロゲートは必要ありませんか? (なぜですか?たとえば、別の重要な変更:私が使用しているOpenJDKは、匿名クラス[関数インターフェイス]またはラムダ式でキャプチャされるjavac
ように変数とパラメーターを宣言する必要がなくなりました)final
したがって、問題は一般的に次のとおりです。ラムダでチェック済み例外をバイパスする方法はありますか、またはJava 8が最終的にリリースされるまで、将来的に計画されていますか?
更新 1
うーん、私たちが現在持っているものを理解している限り、参照されている記事は 2010 年のものですが、現時点では方法がないようです: Brian Goetz は Java で例外の透過性を説明しています。Java 8 で何も変わっていない場合、これは答えと見なすことができます。また、Brian は、interface ExceptionalCallable<V, E extends Exception>
(私が言及しIUnsafeOut<T, E extends Throwable>
たコードの遺産から外れたもの) はほとんど役に立たないと言い、私も彼に同意します。
私はまだ何か他のものを見逃していますか?