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 字段由许多头管理。

只要线程处于活动状态并且 ThreadLocal 实例可访问,每个线程都持有对其线程局部变量副本的隐式引用;在线程消失后,它的所有线程本地实例副本都将受到垃圾回收(除非存在对这些副本的其他引用)。

如果您有 5 个线程可以访问 connectionHolder,您会发现 5 个 ThreadLocal 管理该值的 5 个实例

于 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 回答