懒惰实例化最终字段

dog*_*ane 2 java final

是否有可能懒惰地实例化最终字段?

以下代码无法编译:

public class Test{
    private final Connection conn;

    public Connection getConnection(){
        if(conn==null){
            conn = new Connection();
        }
        return conn;
    }
}
Run Code Online (Sandbox Code Playgroud)

还有其他选择吗?

Jon*_*eet 8

不是.最终字段的要点是它在构造期间设置一次,之后永远不会改变.conn在您的情况下,编译器或VM如何知道任何有用的东西?怎么会知道只有那个属性应该能够设置它,而不是其他方法呢?

也许如果你解释了你想要的语义,我们可以想出一个替代品.您可能有一个"提供者"接口,表示获取值的方式,然后MemoizingProvider代理另一个提供者,但只有一次,否则缓存该值.这也无法为缓存值设置最终字段,但至少它只能在一个地方.