Java枚举支持什么方法?但不是用c#?

Java枚举支持什么方法?但不是用c#?,c#,java,enumeration,C#,Java,Enumeration,我正在查看java中执行单例的正确方法代码: 我有点困惑,如何向枚举添加方法 public enum Elvis { INSTANCE; private final String[] favoriteSongs = { "Hound Dog", "Heartbreak Hotel" }; public void printFavorites() { System.out.println(Arrays.toSt

我正在查看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中的枚举实际上是一个类。隐式扩展java.lang.Enum的一种。您在
实例中看到的特殊语法
是枚举常量的声明。这将用于生成可以在代码中引用的枚举类的实例。事实上,您甚至可以为枚举使用非默认构造函数,并在常量声明中使用它。例如:

public enum Test {

    INSTANCE("testing");

    private final String content;
    public Test(final String content) {
        super();
        this.content = content;
    }

}

将枚举视为真实对象具有某些优势。在枚举中加入一些逻辑很方便,但也不应该被滥用。然而,在我看来,通过enum的单例模式是一个很好的解决方案。

给出一个稍微不同的答案,我想你是在问,
实例line是以下C#示例中的
Instance
的等效行:

这是为Java
enum
创建
值的方法。为了进一步说明该示例,Java枚举可以是:

public enum Gender {
    MALE,
    FEMALE;
}
其中值类型为
Gender.MALE
Gender.MALE
,相当于:

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();

我不确定问题是什么。如果你问“为什么这种语法在Java中有效?”,那是因为用Java设计枚举的人决定了。顺便说一句,对于“向枚举添加方法”的一些解释,扩展方法可能会有帮助。在我看来,你的示例就像是C#等效于
结构的黑客Java变通方法。通过查看您提供的链接中的页面,看起来这样做是为了提高内存效率。但是,你必须考虑的一件大事是维修性。三年后,开发人员是要看代码并理解它,还是默默地希望世界上所有的危险都发生在你的头上?@JimSchubert这个例子就是用Java实现单例对象的“正确”方法。在
上使用
枚举
可以保证只创建一个实例,因为在Java中,
枚举
是一个
,所以可以将所有相同的函数/变量附加到该类<默认情况下,C#中的code>Struct
s不是单例。它就像一个类一样可维护,在最终产品上有适当的文档,并且文档化了
Enum
而不是
class
。这是一个很好的清晰答案。简言之,将Java枚举类型a视为常规类,它可以有字段、构造函数和方法,但只附带一组预定义的实例。@G_H在这种情况下是
INSTANCE
一个特殊关键字,还是可以是您选择的任何名称?@JimSchubert您可以选择任何符合Java语言规范的名称。这里没有什么特别的意思。不过,枚举使用大写名称是标准做法<代码>实例
在Java中不是关键字,在小写中也不是关键字
instanceof
为,因此无法使用。
Elvis.Instance.PrintFavorites();