Java枚举支持什么方法?但不是用c#?
我正在查看java中执行单例的正确方法代码: 我有点困惑,如何向枚举添加方法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
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
的等效行:
这是为Javaenum
创建值的方法。为了进一步说明该示例,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();