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中的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.MALE
和Gender.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();