使用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