使用new Xxx(){};这种语法创建对象的语义解析

在看Java并发编程实战这本书的时候,看到一个代码如下

/**
 * ConnectionDispenser
 * <p/>
 * Using ThreadLocal to ensure thread confinement
 *
 * @author Brian Goetz and Tim Peierls
 */
public class ConnectionDispenser {
    static String DB_URL = "jdbc:mysql://localhost/mydatabase";

    private ThreadLocal<Connection> connectionHolder
            = new ThreadLocal<Connection>() {
                public Connection initialValue() {
                    try {
                        return DriverManager.getConnection(DB_URL);
                    } catch (SQLException e) {
                        throw new RuntimeException("Unable to acquire Connection, e");
                    }
                };
            };

    public Connection getConnection() {
        return connectionHolder.get();
    }
}

这种在构造器声明后面直接接一个{}代码块的方法感觉以前好像见过,但是又不太确定,因为不属于匿名内部类的写法。于是在网上搜到一篇博客,做个记录,如下,解决了疑惑,其实这样的写法是对方法进行了重写。因为ThreadLocal里是有initialValue()这个方法的,会在初次调用ThreadLocal.get()方法的时候调用该方法来获取初始值。只不过书里的这个代码示例没有加@Override的注解标识,导致我有些误解,以为是直接新加了一个方法,想着也没有这样的语法啊,所以导致不理解。

另外还有一个嵌入静态代码块的方法也可以用这种类似的写法,下面这个博客的博主也提到了(重要,比较优美的写法)

https://blog.csdn.net/shenhaiyushitiaoyu/article/details/84142618

原文地址:https://www.cnblogs.com/skyvalley/p/15335840.html