在“新”之后/之后使用花括号的代码?

时间:2011-07-13 21:23:21

标签: java syntax curly-braces

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

我不明白星星内部发生了什么。这是一种将方法插入类的方法吗?

5 个答案:

答案 0 :(得分:5)

答案 1 :(得分:5)

ThreadLocal的initialValue()方法只是构造一个包含非null值的ThreadLocal的方法。

编辑:哦,我知道那不是你要问的。你所拥有的就像你做的一样:

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

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

答案 2 :(得分:3)

在星星内你有一个匿名的内部类,这意味着:

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

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

接下来,对于ThreadLocal部分,基于ThreadLocal Javadoc,connectionHolder字段由许多theads管理。

  

每个线程都拥有对其线程局部变量副本的隐式引用,只要该线程处于活动状态并且可以访问ThreadLocal实例;在一个线程消失之后,它的所有线程局部实例副本都要进行垃圾收集(除非存在对这些副本的其他引用)。

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

答案 3 :(得分:2)

这是一个Anonymous Inner Class,它通常实现一些回调或类似的接口,Swing将它用于监听器。

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

您可以通过这种方式覆盖对象的单个实例上的方法,因此,如果您只希望特定实例以不同的方式运行,则可以在该实例上覆盖所需的多个方法。

答案 4 :(得分: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() { /* ... */ } };