多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 枚举真的是最好的单例吗? > 原文: [https://howtodoinjava.com/java/enum/is-enum-really-best-for-singletons/](https://howtodoinjava.com/java/enum/is-enum-really-best-for-singletons/) 您必须多次听到**枚举始终是在 Java 中实现单例设计模式**的最佳选择。 他们真的最好吗? 如果可以的话,它比其他可用技术更好吗? 让我们找出答案。 编写单例实现总是很棘手。 我在[**博客文章**](//howtodoinjava.com/design-patterns/singleton-design-pattern-in-java/)中已经讨论了几种方法(包括我最喜欢的方法)。 我在那里写清楚,枚举为线程安全提供了隐式支持,并且只保证了一个实例。 这也是**以最小的努力**获得单例的好方法。 ## 枚举作为单例的问题 话虽这么说,就像宇宙中的任何其他事物一样,这种方法确实有其缺点,您在做出任何决定之前需要考虑这些缺点。 1. 默认情况下,枚举不支持**延迟加载**。 2. 虽然这种情况非常罕见,但是如果您改变主意并现在想将**单例转换为多例,枚举将不允许**。 如果以上两种情况对任何人都没有问题,则枚举可能是最佳选择。 无论如何,顺便说一句,编译后,java 枚举只能通过其他方法(例如 `values()`和`valueOf()`…等)转换为类。 ## 基于枚举的单例示例 一旦您决定编写基于**枚举的单例**,编写它就非常容易,例如 ```java enum Singleton { INSTANCE; // instance vars, constructor private final Connection connection; Singleton() { // Initialize the connection connection = DB.getConnection(); } // Static getter public static Singleton getInstance() { return INSTANCE; } public Connection getConnection() { return connection; } } ``` 现在您可以使用`final Singleton s = Singleton.getInstance()`了。 请记住,由于这是一个枚举,因此您也始终可以通过`Singleton.INSTANCE`进行访问。 学习愉快!