枚举和单例类有啥区别[重复]

Posted

技术标签:

【中文标题】枚举和单例类有啥区别[重复]【英文标题】:What is the difference between Enum and a singleton class [duplicate]枚举和单例类有什么区别[重复] 【发布时间】:2018-09-25 06:46:05 【问题描述】:

我发现 Enum 和 Singleton 类之间几乎没有区别,但不完全相信 Enum 是否可以用来代替 Singleton。

如果它可以使用,那么定义单例类需要什么?

【问题讨论】:

在提问之前寻找类似的问题。这个问题经常被问到。 我已经提到“我发现很少有区别”。但不相信..请把链接发给我 我什至不明白为什么有人会混合使用这两个术语。他们在那里有两个完全不同的原因和场景。 enum 定义了一组 constantssingleton 是一种在您想确保某人只能创建您的类的一个实例时使用的技术。 枚举也可以创建单个实例 【参考方案1】:

枚举确保您有一个预定义的集合实例,并且不能创建更多实例。

单例确保您只有一个实例。

从这个意义上说,您可以将 Singleton 想象成一个只有一个元素的枚举。

但枚举和单例(或一般类)之间存在更多差异(技术和设计角度)。

当您问为什么甚至使用单例而不是枚举时:一个原因可能是单例可以“延迟加载”,而枚举不能。

【讨论】:

【参考方案2】:

枚举: Java 中的枚举是一种包含一组固定常量的数据类型。 Java 枚举常量是静态的,并且是隐式的。它从 JDK 1.5 开始可用。要创建枚举,请使用 enum 关键字(而不是类或接口),并用逗号分隔常量。枚举声明可以在类外或类内完成,但不能在方法内完成。 根据 Java 命名约定,建议我们将常量命名为全部大写

// A simple enum example where enum is declared
// outside any class (Note enum keyword instead of
// class keyword)
enum Color

    RED, GREEN, BLUE;

 
public class Test

    // Driver method
    public static void main(String[] args)
   
        Color c1 = Color.RED;
        System.out.println(c1);
   

/////////////////////////////////////// /////////////////

单例类: 在面向对象编程中,单例类是一次只能有一个对象(类的一个实例)的类。 第一次之后,如果我们尝试实例化 Singleton 类,新变量也指向创建的第一个实例。

   public class Singleton 

   private static Singleton singleton = new Singleton( );

   /* A private Constructor prevents any other
    * class from instantiating.
    */
     private Singleton()  

     /* Static 'instance' method */
     public static Singleton getInstance( ) 
        return singleton;
    

    /* Other methods protected by singleton-ness */
    protected static void demoMethod( ) 
       System.out.println("demoMethod for singleton");
    
 

【讨论】:

以上是关于枚举和单例类有啥区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

请问java 单例类 与 静态类 有何不同?

静态类和单例模式区别

单例类和元类

Kotlin中数据类和单例类的实现和讲解面向对象编程接口的实现

如何使用 Mockito/Powermock 模拟枚举单例类?

Java中Class和单例类的作用与类成员的理解