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);
}
};
我不理解星号内部发生了什么。这是将方法插入到类中的一种方式吗?
ThreadLocal的initialValue()方法仅是构造一个ThreadLocal,使其持有一个非null值的一种方法。
编辑:哦,我明白了,那不是你所问的。你所写的与下面的代码是相同的:
public class MyOwnThreadLocal extends ThreadLocal {
public Connection initialValue() {
return DriverManager.getConnection(DB_URL);
}
}
在星号中,你有一个匿名内部类,它的意思是:
这是一种语法快捷方式,可以在不声明完整的标准Java类的情况下实现接口或抽象类的行为。您正在为固定上下文定义精确的行为。
接下来,对于ThreadLocal部分,根据ThreadLocal Javadoc,connectionHolder字段由许多线程管理。
只要线程存活并且ThreadLocal实例可访问,每个线程都会持有对其线程局部变量副本的隐式引用;当线程消失时,它的所有线程局部实例的副本都将受到垃圾回收的影响(除非存在对这些副本的其他引用)。
如果您有5个访问connectionHolder的线程,则会找到5个ThreadLocal,它们管理值的5个实例。
这是一个通常实现某个回调接口的匿名内部类,Swing将其用于监听器。
在这种情况下,它正在实现ThreadLocal<Connection>
的特定实例上的initialValue()
方法。
您可以通过这种方式覆盖单个对象实例上的方法,因此,如果您只想让特定实例以不同的方式运行,您可以覆盖该实例上的尽可能多的方法。
这是一个匿名内部类。它是扩展基类的一种简短语法:
class AnonClass extends ThreadLocal<Connector> {
public Connection initialValue() {
return DriverManager.getConnection(DB_URL);
}
}
私有静态AnonClass connectionHolder = new AnonClass();
你可以使用接口来做同样的事情(在实现回调时最常见)。例如:
interface Callback {
void doIt();
}
回调测试 = 新的回调() { public void doIt() { /* ... */ } };