【问题标题】:Code with curly braces in/after "new"?在“新”中/之后带有花括号的代码?
【发布时间】:2011-07-13 21:23:20
【问题描述】:
private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>() {
    public Connection initialValue() { 
         return DriverManager.getConnection(DB_URL);
    }
};

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

【问题讨论】:

标签: java syntax curly-braces


【解决方案1】:

ThreadLocal 的initialValue() 方法只是构造一个持有非 null 值的 ThreadLocal 的一种方式。

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

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

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

【讨论】:

  • 所以如果我理解正确,那么变量 connectionHolder 实际上不是 ThreadLocal 对象,而是 Threadlocal 对象的无名子类?
  • 完全正确。如果您查看编译后的输出,您将看到一个名为“$1.class”的类文件。这就是匿名类的编译方式。
【解决方案2】:
【解决方案3】:

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

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

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

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

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

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

【讨论】:

    【解决方案4】:

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

    在这种情况下,它在ThreadLocal&lt;Connection&gt; 的特定实例上实现initialValue() 方法。

    您可以通过这种方式覆盖单个 Objects 实例上的方法,因此如果您只希望特定实例以不同的方式运行,您可以覆盖该实例上的任意数量的方法。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-12-19
        • 2016-12-18
        • 1970-01-01
        • 2012-01-10
        • 1970-01-01
        • 2016-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多