是否可以延迟实例化最终字段?
以下代码无法编译:
public class Test{
private final Connection conn;
public Connection getConnection(){
if(conn==null){
conn = new Connection();
}
return conn;
}
}
还有其他选择吗?
最佳答案
没有。 Final 字段的要点是它在构建期间设置一次,此后永远不会更改。在您的情况下,编译器或虚拟机如何知道有关 conn
的任何有用信息?它怎么知道只有该属性才能设置它,而不是其他方法?
也许如果您解释了您想要的语义,我们就可以想出一个替代方案。您可能有一个代表获取值的方式的“提供者”接口(interface),然后是一个代理另一个提供者的 MemoizingProvider 接口(interface),但只能代理一次,否则会缓存该值。这也无法为缓存值提供最终字段,但至少它只会位于一个位置。
关于java - 延迟实例化最终字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/672696/