private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>() {
public Connection initialValue() {
return DriverManager.getConnection(DB_URL);
}
};
星の中にある部分で何が起こっているのかわかりません。それはクラスにメソッドを挿入する方法ですか?
private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>() {
public Connection initialValue() {
return DriverManager.getConnection(DB_URL);
}
};
星の中にある部分で何が起こっているのかわかりません。それはクラスにメソッドを挿入する方法ですか?
これは匿名の内部クラスです-http://download.oracle.com/javase/tutorial/uiswing/events/generalrules.html#innerClassesを参照してください
ThreadLocalのinitialValue()メソッドは、null以外の値を保持するThreadLocalを構築するための単なる方法です。
編集:ああ、それはあなたが求めていることではないようです。あなたが持っているものはあなたがしたのと同じです:
public class MyOwnThreadLocal extends ThreadLocal {
public Connection initialValue() {
return DriverManager.getConnection(DB_URL);
}
}
お使いのバージョンが完全に別個のクラス定義を必要としないことを除いて、それは「匿名クラス」と呼ばれます。
星の中には匿名の内部クラスがあります:
これは、完全な標準Javaクラスを宣言せずに、インターフェースまたは抽象クラスの動作を実装するための構文ショートカットです。固定コンテキストの正確な動作を定義しています。
次に、ThreadLocal部分については、 ThreadLocal Javadocに基づいて、connectionHolderフィールドが多くのtheadによって管理されます。
各スレッドは、スレッドが生きていてThreadLocalインスタンスにアクセスできる限り、スレッドローカル変数のコピーへの暗黙の参照を保持します。スレッドがなくなると、スレッドローカルインスタンスのすべてのコピーがガベージコレクションの対象になります(これらのコピーへの他の参照が存在しない場合)。
connectionHolderにアクセスできるスレッドが5つある場合は、値の5つのインスタンスを管理する5つのThreadLocalが見つかります。
これは匿名の内部クラスであり、通常はコールバックなどのインターフェイスを実装しています。Swingはこれをリスナーに使用します。
この場合、のinitialValue()
特定のインスタンスにメソッドを実装していますThreadLocal<Connection>
。
この方法でオブジェクトの単一インスタンスのメソッドをオーバーライドできるため、特定のインスタンスだけを別の方法で動作させたい場合は、そのインスタンスのメソッドを必要な数だけオーバーライドできます。
これは匿名の内部クラスです。これは、基本クラスを拡張するための短い構文です。
class AnonClass extends ThreadLocal<Connector> {
public Connection initialValue() {
return DriverManager.getConnection(DB_URL);
}
}
private static AnonClass connectionHolder = new AnonClass();
インターフェイスでも同じことができます(コールバックを実装するときに最も一般的に見られます)。例えば:
interface Callback {
void doIt();
}
Callback test = new Callback() {
public void doIt() { /* ... */ }
};