为什么枚举单例是惰性的?

2023-12-15

I saw 像这样的答案,试图通过comments,并不满意例子在这里.

也许是时候提出这个具体问题了......

为什么调用枚举单例实现lazy?

public enum EnumLazySingleton {
    INSTANCE;
    EnumLazySingleton() {
        System.out.println("constructing: " + this);
    }
    public static void touchClass() {}
}

它有何不同eager执行?

public class BasicEagerSingleton {
    private static final BasicEagerSingleton instance = new BasicEagerSingleton();
    public static BasicEagerSingleton getInstance() {
        return instance;
    }
    private BasicEagerSingleton() {
        System.out.println("constructing: " + this);
    }
    public static void touchClass() {}
}

两者都会在不访问的情况下初始化实例INSTANCE/getInstance()- 例如称呼touchClass().

public class TestSingleton {
    public static void main(String... args) {
        System.out.println("sleeping for 5 sec...");
        System.out.println("touching " + BasicEagerSingleton.class.getSimpleName());
        BasicEagerSingleton.touchClass();
        System.out.println("touching " + EnumLazySingleton.class.getSimpleName());
        EnumLazySingleton.touchClass();
    }
}

Output:

sleeping for 5 sec...
touching BasicEagerSingleton
constructing: BasicEagerSingleton@7bfcd12c
touching EnumLazySingleton
constructing: INSTANCE

现在,我们可以说两者都是lazy。什么是eager then?

很明显(例如)“双重检查锁定”方式实际上是懒惰的(并且混乱且缓慢)。但如果 enum 是惰性的,那么any由于不可避免的类加载,单例是惰性的——事实上,一切都是惰性的。到什么时候这种区别将不再有意义?


前两个链接的答案(通过彼得·劳瑞 and 约阿希姆·绍尔)都同意枚举是not延迟初始化。第三个链接中的答案对于延迟初始化的含义完全是错误的。

使用枚举作为单例的建议源自 Josh Bloch 的《Effective Java》。值得注意的是,关于枚举单例的章节没有提到惰性。后面有一章专门讨论延迟初始化,同样没有提到枚举。本章有两个亮点。

  • 如果需要在静态字段上使用延迟初始化来提高性能,请使用延迟初始化持有者类习惯用法。
  • 如果您需要在实例字段上使用延迟初始化来提高性能,请使用双重检查习惯用法。

毫无疑问,如果枚举以任何方式延迟初始化,那么它们将是此列表中的另一个习惯用法。事实上它们不是,尽管对延迟初始化的含义的混淆会导致一些不正确的答案,如OP所示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么枚举单例是惰性的? 的相关文章

  • 将所有 BigDecimal 运算设置为特定精度?

    我的Java程序以高精度计算为中心 需要精确到至少120位小数 因此 程序中所有非整数都将由 BigDecimal 表示 显然 我需要指定 BigDecimal 的舍入精度 以避免无限小数表达式等 目前 我发现必须在 BigDecimal
  • java本地时间格式不带年份

    我喜欢将本地时间格式格式化为不带年份的字符串 目前我可以显示包含年份的本地格式 java text DateFormat df java text DateFormat getDateInstance java text DateForma
  • 如何在谷歌地图中使用latlng字符串数组绘制多边形

    在我的应用程序中 我有包含 imagview 的 recyclerview 并且该 imageview 通过使用我存储在 sqlite 中的坐标包含静态地图图像 当我单击该图像时 我将该字符串数组格式的坐标传递给其他地图活动 然后使用该字符
  • IntelliJ Ultimate 在 Play 2.3 (Java) 项目测试中找不到路由

    虽然我的测试运行得很好 但 IntelliJ 抱怨它找不到路由对象 并且代码自动完成无法工作 我已经查看了所有文档 这应该可以工作 这是 IntelliJ 的报告内容 关于我的项目配置可能有什么问题有什么想法吗 这很可能与以下事实有关 ro
  • Java 相当于 Perl 的 s/// 运算符?

    我有一些代码正在从 Perl 转换为 Java 它大量使用了正则表达式 包括s 操作员 我已经使用 Perl 很长时间了 但仍然习惯 Java 的做事方式 特别是 字符串似乎更难使用 有谁知道或有一个完全实现的Java函数s 这样它就可以处
  • 使用 Hibernate 和 Apache DBCP 的 MySQL 连接池问题

    看来我的应用程序有问题 当应用程序在启动后闲置很长时间 我不确定确切的时间 时 我会在日志中收到以下错误消息 我使用 Spring Hibernate MySQL 和 ApacheDBCP 进行连接池 ERROR org hibernate
  • @Cachable 在没有输入参数的方法上?

    我有问题 org springframework cache annotation Cachable注解 Bean public ConcurrentMapCache cache return new ConcurrentMapCache
  • FXML 文件中的 getHostServices().showDocument()

    有没有简单的方法可以将 getHostServices showDocument 命令放入 toHomepage 方法中 而不是执行一行又一行的代码 这样代码应该看起来干净简单 package sample import javafx ap
  • 将 RequestBody json 转换为对象 - Spring Boot

    我是 java 开发的初学者 但之前有 PHP 和 Python 等编程语言的经验 对于如何进行 Spring Boot 的开发几乎没有什么困惑 我正在开发一个rest API 它有以下请求 key value key1 value1 pl
  • 整数与 int 比较

    我是新来的java 我现在正在学习非原始整数类型java 我知道以下比较无效并引发编译错误 String str c Char chr c if str chr return true 上面的代码片段给了我 Test java lineNu
  • Java检测鼠标长按

    如果用户按下 JList 组件超过 3 秒 有什么方法可以捕获事件吗 我发现困难的部分是即使在用户松开鼠标左键之前也需要触发事件 这可以通过 mousePressed 和 mouseReleased 组合轻松完成 您可以在 mouseDow
  • 为什么java(>=7版本)不支持运行没有main方法的程序? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 class WithoutMain static System out println Without main class Sy
  • Elasticsearch NodeBuilder 与 TransportClient

    对于其他 Elasticsearch 开发人员来说 这可能是一个非常简单 而且愚蠢 的问题 这两者之间有什么区别 我正在从 Java Web 应用程序连接到远程 Elasticsearch 服务器 到目前为止我一直在使用 Transport
  • 如何在Java中通过反射调用代理(Spring AOP)上的方法?

    一个接口 public interface Manager Object read Long id 实现该接口的类 Transactional Public class ManagerImpl implements Manager Over
  • 通过 ssh 发送命令并读取输出结果

    我有代码通过 ssh 连接到远程服务器并向其发送 2 个或更多命令 例如 cd export home ops bin和 viewlinkload time 20131205 19 但我没有看到命令执行 也没有收到结果 我需要获取服务器返回
  • 如何从Java中的连接获取查询字符串?

    我正在编写一个方法 尝试记录数据库调用 形成连接到它的连接 在查询之后 有很多地方调用方法 connect 来启动并调用 cleanUp 方法来结束 我不能并且不想修改每个地方 所以顺序是这样的 Connection con connect
  • 从数字列表中生成所有唯一对,n 选择 2

    我有一个元素列表 假设是整数 我需要进行所有可能的两对比较 我的方法是 O n 2 我想知道是否有更快的方法 这是我在java中的实现 public class Pair public int x y public Pair int x i
  • Java 应用程序启动,ProcessBuilder 一段时间后被阻止

    我正在开发一个 Java 桌面应用程序 我们称之为控制台 包含 3 个按钮 其中两个启动 Win32 应用程序 第三个应该启动一个可执行的 jar ProcessBuilder pb new ProcessBuilder java jar
  • 用 lambda 表达式替换匿名函数

    我在 Java 8 映射操作中传递一个函数 Intellij 告诉我它可以用 lambda 表达式替换 但我不知道如何在不创建中间对象结构的情况下做到这一点 这就是我所做的 List
  • 在java中打印阿拉伯字符串

    我试图在 java 中显示阿拉伯语文本 但它显示垃圾字符 示例 或有时在我打印时仅显示问号 我如何才能打印阿拉伯语 我听说它与unicode和UTF 8有关 这是我第一次使用语言 所以不知道 我正在使用 Eclipse Indigo IDE

随机推荐

  • 卡桑德拉更新专栏

    我如何更新 cassandra 数据库中的列 columnfam username name edds surname surname email email protected 例如我需要更新姓氏 我使用 PHP 客户端 PHPCASSA
  • 当函数是 lambda 或嵌套函数时,concurrent.futures.ProcessPoolExecutor 会挂起

    任何人都可以深入了解为什么使用 lambda 或嵌套函数 f 将使concurrent futures ProcessPoolExecutor挂在下面的代码示例中吗 import concurrent futures def f2 s re
  • 为什么 postgres 的日期范围上限函数返回独占边界?

    我为这篇文章创建了一个 sql 小提琴 http sqlfiddle com 15 7b5d7 1 0 问题 1 为什么插入一条记录时会出现daterange具有独占边界的实际上存储了具有包含下限和独占上限的范围 为什么 pg 不将它们都存
  • C 函数分配不正确的浮点值

    我试图返回一个浮点值并将其分配给一个浮点变量 但新浮点值与返回的值不同 float getVoltageReading return 1 2f void updateUIReadings uint8 t menuID float integ
  • IOS 10 宽色:我需要担心吗?

    The 发行说明iOS 10 有一个标题为广色域 让我感到困惑的是这一行 如果您的应用程序依赖 UIKit 来限制组件值 无论您是创建颜色还是询问颜色的组件值 则在链接到 iOS 10 时 您需要更改应用程序的行为 钳位元件值是什么意思 这
  • 无法找到或加载主类 org.gradle.wrapper.GradleWrapperMain

    我通过删除本地目录来清理整个项目 例如 gradle m2 android and workspace project gradle并选择File gt Invalidate Caches Restart 在 Android Studio
  • 地理编码 API 超出速率限制

    我正在使用地理编码 API 来查询一组 10 万用户的位置坐标 但是 由于速率限制 我每天无法触发超过 2500 个请求 为了我的学习目的 我需要不受限制的访问 这是我大学的一个项目 有人可以引导我走向正确的方向吗 Per the 使用限制
  • 非委托类型的事件

    我已经实现了一个类似于此接口的类 ImmutableObject true public interface ICustomEvent void Invoke object sender EventArgs e ICustomEvent C
  • 增加 C/C++ 程序使用的(非堆栈)内存

    我正在具有 12 GB RAM 的 Windows 操作系统上运行内存密集型作业 根据我的计算 4 GB 内存应该足以运行该程序 我正在运行我用动态内存分配编写的程序 我有两个版本的 C 和 C 程序 malloc free and new
  • python参数类型提示支持嵌套类型信息吗?

    我有一个逻辑如下的函数 def computeProbability x i np array np int32 colProbabilities list dict string np float32 gt list double ret
  • AngularJs图像上传到S3

    I am 创建网络应用程序 带有 ng 文件上传功能的 AngularJS 前端 https github com danialfarid ng file upload Node js 后端 希望能够将图像上传到我的 Amazon S3 存
  • 如何在 Firefox 中打印 Iframe PDF?

    是的 我也看到了与此相关的其他问题 但它们没有帮助我 所以这是我的代码 raspe4atat click function ajax url raspe4atat type GET success function ajax url ifr
  • “R”包“ranger”中的“最大深度”相当于什么?

    其他随机森林工具具有限制特定分支上的最大分割深度的 刻度盘 例如 h2o randomForest 具有 max 深度 游侠 的版本是什么 我不熟悉h2o randomForest包 但我对随机森林的一般理解是 每棵树都会生长 直到树的每片
  • 通过套接字发送文件

    我在将数据作为文件从套接字的一端发送到另一端时遇到问题 发生的情况是服务器和客户端都试图读取该文件 因此该文件永远不会被发送 我想知道如何让客户端阻塞 直到服务器完成读取客户端发送的文件 我使用发送和接收来处理原始数据包 但我认为这是一个更
  • 如何在 urlparse 中用新值替换查询?

    所以我有一个数据如下 item s780 scene7 com is image forever 301596014 001 hei 98 wid 98 使用 urlparse 模块 我怎样才能用新的大小替换上面的数据 使其看起来像这样 i
  • python groupby和列表交互

    如果我们运行以下代码 from itertools import groupby s 1223 r groupby s x list r a list g for k g in r print a b list g for k g in g
  • ggplot2 Facet Wrap 按 y 轴而不是 x 轴重新排序

    我想绘制多面条形图 并从左到右从最大到最小值对它们进行排序 我应该能够使用与此类似的代码来做到这一点 library ggplot2 ggplot mpg aes reorder cyl hwy hwy geom col facet wra
  • AWS RDS Postgres 连接失败

    我正在开始使用 AWS RDS 我正在尝试创建一个公共 PostgreSQL 实例 免费层 并尝试通过 SQL Workbench 从本地笔记本电脑进行连接 我正在按照此指示进行操作https aws amazon com getting
  • Java - 使用 Accessor 和 Mutator 方法

    我正在做家庭作业 我对应该如何做感到困惑 问题是 创建一个名为IDCard的类 其中包含一个人的姓名 身份证号码 以及包含此人照片的文件的名称 写 每个字段的访问器和修改器方法 添加 下面是该类的两个重载构造函数 公共IDCard 公共ID
  • 为什么枚举单例是惰性的?

    I saw 像这样的答案 试图通过comments 并不满意例子在这里 也许是时候提出这个具体问题了 为什么调用枚举单例实现lazy public enum EnumLazySingleton INSTANCE EnumLazySingle