java - 延迟实例化最终字段

标签 java final

是否可以延迟实例化最终字段?

以下代码无法编译:

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/

相关文章:

java - 单行双空检查

c# - 为什么 Java 类不能既是抽象类又是最终类

java - 确保 Java 中的 Final 字段已初始化

带有常量的 Java final 类

java - 接口(interface)变量

java - 去除所有长度小于或大于 6 的数字

java - 将 3rd-party jar 部署到 clojars?

java - 使用 olingo2 更新同一 PUT 和导航链接中的父实体和子实体

java - 部署到 Glassfish 4.1 时无效的 URL 模式

java - 为什么 stream sorted() 无法推断我的类型?