Java枚举支持方法吗?但在c#中不是这样

本文关键字:但在 支持 枚举 方法 Java | 更新日期: 2023-09-27 18:12:38

我正在看这段代码的正确方法,在java中做一个单例:在java中实现一个单例模式的有效方法是什么?

我有点困惑,你如何添加一个方法到枚举?

 public enum Elvis {
       INSTANCE;
       private final String[] favoriteSongs =
           { "Hound Dog", "Heartbreak Hotel" };
       public void printFavorites() {
           System.out.println(Arrays.toString(favoriteSongs));
       }
   }

上面代码中的枚举,对我来说甚至没有意义,你有符号:

INSTANCE;

这怎么是正确的行?

我是从c#来的,这种语法让我很好奇,我希望有人能解释或让上面的意义。

我想这意味着java有一个更纯粹的枚举的想法,因为它可以有行为?

Java枚举支持方法吗?但在c#中不是这样

Java中的enum实际上是一个类。隐式扩展java.lang.Enum。您在INSTANCE;中看到的特殊语法是枚举常量的声明。这将用于创建枚举类的实例,该实例可以在代码中引用。事实上,您甚至可以为枚举提供一个非默认构造函数,并在常量声明中使用它。例子:

public enum Test {
    INSTANCE("testing");
    private final String content;
    public Test(final String content) {
        super();
        this.content = content;
    }
}

将枚举作为真对象处理有一定的优点。在枚举中加入一些逻辑很方便,但也不应该被滥用。在我看来,通过枚举的单例模式是一个很好的解决方案。

给出一个稍微不同的答案,也是我认为您要问的答案,Java代码中的INSTANCE;行是以下c#示例中Instance的等效行:

enum Elvis
{
    Instance
}

这是您为Java enum创建value的方式。进一步说明,Java枚举可以是:

public enum Gender {
    MALE,
    FEMALE;
}

其中值类型为Gender.MALEGender.FEMALE,相当于:

enum Gender
{
    Male,
    Female
}
在c#。

如果我偏离了你的问题,我道歉。

您可以使用扩展方法

enum Elvis
{
  Instance
}
static class ElvisExtension
{
  private static readonly string[] FavoriteSongs = { "Hound Dog", "Heartbreak Hotel" };
  public static void PrintFavorites(this Elvis singleton)
  {
    Console.WriteLine(string.Join(", ", FavoriteSongs));
  }
}

用法:

Elvis.Instance.PrintFavorites();

相关文章: