3
private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>() {
    public Connection initialValue() { 
         return DriverManager.getConnection(DB_URL);
    }
};

星の中にある部分で何が起こっているのかわかりません。それはクラスにメソッドを挿入する方法ですか?

4

5 に答える 5

5

これは匿名の内部クラスです-http://download.oracle.com/javase/tutorial/uiswing/events/generalrules.html#innerClassesを参照してください

于 2011-07-13T21:25:20.820 に答える
5

ThreadLocalのinitialValue()メソッドは、null以外の値を保持するThreadLocalを構築するための単なる方法です。

編集:ああ、それはあなたが求めていることではないようです。あなたが持っているものはあなたがしたのと同じです:

public class MyOwnThreadLocal extends ThreadLocal {
    public Connection initialValue() {
        return DriverManager.getConnection(DB_URL);
    }
}

お使いのバージョンが完全に別個のクラス定義を必要としないことを除いて、それは「匿名クラス」と呼ばれます。

于 2011-07-13T21:25:53.583 に答える
3

星の中には匿名の内部クラスがあります:

  • クラスにクラスを埋め込んでいます(つまり、内部クラスです)
  • 内部クラスはメソッド本体内で定義されます(したがって、匿名の内部クラスです)

これは、完全な標準Javaクラスを宣言せずに、インターフェースまたは抽象クラスの動作を実装するための構文ショートカットです。固定コンテキストの正確な動作を定義しています。

次に、ThreadLocal部分については、 ThreadLocal Javadocに基づいて、connectionHolderフィールドが多くのtheadによって管理されます。

各スレッドは、スレッドが生きていてThreadLocalインスタンスにアクセスできる限り、スレッドローカル変数のコピーへの暗黙の参照を保持します。スレッドがなくなると、スレッドローカルインスタンスのすべてのコピーがガベージコレクションの対象になります(これらのコピーへの他の参照が存在しない場合)。

connectionHolderにアクセスできるスレッドが5つある場合は、値の5つのインスタンスを管理する5つのThreadLocalが見つかります。

于 2011-07-13T21:40:33.973 に答える
2

これは匿名の内部クラスであり、通常はコールバックなどのインターフェイスを実装しています。Swingはこれをリスナーに使用します。

この場合、のinitialValue()特定のインスタンスにメソッドを実装していますThreadLocal<Connection>

この方法でオブジェクトの単一インスタンスのメソッドをオーバーライドできるため、特定のインスタンスだけを別の方法で動作させたい場合は、そのインスタンスのメソッドを必要な数だけオーバーライドできます。

于 2011-07-13T21:24:45.330 に答える
1

これは匿名の内部クラスです。これは、基本クラスを拡張するための短い構文です。

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() { /* ... */ } };

于 2011-07-13T21:29:46.410 に答える