枚举真的是最好的单例吗?

您必须多次听到枚举始终是在 Java 中实现单例设计模式的最佳选择。 他们真的最好吗? 如果可以的话,它比其他可用技术更好吗? 让我们找出答案。

编写单例实现总是很棘手。 我在博客文章中已经讨论了几种方法(包括我最喜欢的方法)。 我在那里写清楚,枚举为线程安全提供了隐式支持,并且只保证了一个实例。 这也是以最小的努力获得单例的好方法。

枚举作为单例的问题

话虽这么说,就像宇宙中的任何其他事物一样,这种方法确实有其缺点,您在做出任何决定之前需要考虑这些缺点。

  1. 默认情况下,枚举不支持延迟加载
  2. 虽然这种情况非常罕见,但是如果您改变主意并现在想将单例转换为多例,枚举将不允许

如果以上两种情况对任何人都没有问题,则枚举可能是最佳选择。

无论如何,顺便说一句,编译后,java 枚举只能通过其他方法(例如 values()valueOf()…等)转换为类。

基于枚举的单例示例

一旦您决定编写基于枚举的单例,编写它就非常容易,例如

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进行访问。