在“new”中/之后使用花括号的代码是什么?

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

我不理解星号内部发生了什么。这是将方法插入到类中的一种方式吗?


5个回答

5

ThreadLocal的initialValue()方法仅是构造一个ThreadLocal,使其持有一个非null值的一种方法。

编辑:哦,我明白了,那不是你所问的。你所写的与下面的代码是相同的:

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

除了你的版本不需要完全独立的类定义,因此它被称为“匿名类”。

如果我理解正确的话,那么变量connectionHolder实际上不是ThreadLocal对象,而是Threadlocal对象的一个无名子类? - jhlu87
完全正确。如果您查看编译输出,您会看到一个名为“<包含connectionHolder的类的名称>$1.class”的类文件。这就是匿名类的编译方式。 - Ryan Stewart


3

在星号中,你有一个匿名内部类,它的意思是:

  • 你在一个类中嵌入了另一个类(所以它是一个内部类)
  • 内部类在方法体内定义(所以它是一个匿名内部类)

这是一种语法快捷方式,可以在不声明完整的标准Java类的情况下实现接口或抽象类的行为。您正在为固定上下文定义精确的行为。

接下来,对于ThreadLocal部分,根据ThreadLocal Javadoc,connectionHolder字段由许多线程管理。

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

如果您有5个访问connectionHolder的线程,则会找到5个ThreadLocal,它们管理值的5个实例。


2

这是一个通常实现某个回调接口的匿名内部类,Swing将其用于监听器。

在这种情况下,它正在实现ThreadLocal<Connection>的特定实例上的initialValue()方法。

您可以通过这种方式覆盖单个对象实例上的方法,因此,如果您只想让特定实例以不同的方式运行,您可以覆盖该实例上的尽可能多的方法。


1

这是一个匿名内部类。它是扩展基类的一种简短语法:

class AnonClass extends ThreadLocal<Connector> {
    public Connection initialValue() { 
         return DriverManager.getConnection(DB_URL);
    }
}

私有静态AnonClass connectionHolder = new AnonClass();

你可以使用接口来做同样的事情(在实现回调时最常见)。例如:

interface Callback {
    void doIt();
}

回调测试 = 新的回调() { public void doIt() { /* ... */ } };


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接