# 枚举真的是最好的单例吗？

> 原文： [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`进行访问。

学习愉快！