java - 如何使用枚举创建单例类

标签 java enums singleton

我正在尝试用 Java 创建一个单例类。 Java5 及以上版本的最佳可用解决方案似乎是使用 enum。但我不确定如何使用 enum 将我的类转换为单例类。以下是我的简化类(class):

public class Employee { 
   private int id; 
   private String name; 
   public Employee() {} 
   public int getId() {
      return id; 
   }
   public void setId( int id ) { 
      this.id = id; 
   } 
   public String getName() { 
      return name; 
   } 
   public void setName( String name ) {
      this.name = name; 
   }
}

当我在网上搜索答案时,我发现了以下代码:

public enum EasySingleton{
   INSTANCE;
}

但是我的类变量和方法在哪里?我不确定如何实现。我知道我们可以为 enum 提供方法,但是我的变量会去哪里呢?对此的任何帮助将不胜感激。

P.S.:请不要争论单例是邪恶的还是反模式的。我只是想知道如何使用 enum 创建单例。

最佳答案

类和枚举之间的区别并没有那么大。我将第一行代码更改为 public enum 而不是 public class 并添加了您的实例的名称。

public enum Employee { // changed "class" to "enum"

   INSTANCE; // added name of the (single) instance

   private int id; 
   private String name; 
   Employee() {} // removed "public"
   public int getId() {
      return id; 
   }
   public void setId( int id ) { 
      this.id = id; 
   } 
   public String getName() { 
      return name; 
   } 
   public void setName( String name ) {
      this.name = name; 
   }
}

请记住,如果你想在一个虚拟机中多次运行你的代码,单例、枚举实例、静态的东西可能会在以后阻碍你。考虑在您的主类中创建一个 Employee 的实例并将其传递给您的应用程序。

除此之外,枚举还有一些其他的特殊功能:

  • 您不能扩展另一个类(只能实现)
  • 可以使用一些预定义的方法(如 static values()getName())
  • 构造函数只能是package private,或者private

关于java - 如何使用枚举创建单例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30940814/

相关文章:

java - 下面的代码运行成功,那么是否意味着我们可以启动线程两次?

java - 更新 JFrame 中的 JPanel

java - 组合包含 HashMap 的数组列表

mysql - 将 1 作为数字保存到 ENUM ('1' ,'0' ) 字段设置值为 0

C# 枚举 : can they take members and functions like java enums?

java - 服务器启动时初始化同步线程池执行器

java - 400 带有 application/x-www-form-urlencoded 数据的错误请求 spring mvc Controller

c - 将错误代码映射到错误描述

swift - 在 Swift 中通过下标访问单例属性

java - 静态方法还是性能方面的单例(Android)?