我应该选择';枚举';Java中短固定列表的over数组?

我应该选择';枚举';Java中短固定列表的over数组?,java,Java,我知道也有类似的问题,我已经阅读了答案,但也许我还没有完全理解其使用的区别,即使我在初始化字符串时理解了它们的区别。例如: String[] favorite = {"dog", "cat", "alien"}; vs 或者,在上述情况下,两者的用法可能相似,但在另一个例子中,它们的区别可以更好地理解?是不是enum在创建类时可以清楚地为变量存储更多属性?enum的最大优点是编译器检查输入错误(类型安全)。例如,如果将值“dag”指定给字符串,编译器不会抱怨。但是,不能将值favorite.d

我知道也有类似的问题,我已经阅读了答案,但也许我还没有完全理解其使用的区别,即使我在初始化
字符串时理解了它们的区别。例如:

String[] favorite = {"dog", "cat", "alien"};
vs


或者,在上述情况下,两者的用法可能相似,但在另一个例子中,它们的区别可以更好地理解?是不是
enum
在创建类时可以清楚地为变量存储更多属性?

enum
的最大优点是编译器检查输入错误(类型安全)。例如,如果将值“dag”指定给字符串,编译器不会抱怨。但是,不能将值
favorite.dag
分配给变量(类型为
favorit
)。另外,
enum
使代码更可读,速度更快(例如,比较)

没有必要对程序过于复杂。
如果有三个字符串,请使用字符串数组。如果您有三个不同的实体,它们除了名称之外还有其他不同之处,请使用enum(很明显,您将以某种方式在其上操作)。

就像@AhmadWabbi所说的,这主要是类型安全

使用枚举,您还可以编写与枚举对应的方法。 例如:

public enum Favorite = {
    dog("woof"), 
    cat("meow"),
    alien("zoink")

    private String sound;

    Favorite(String sound) {
        this.sound = sound;
    }

    public String makeSound() {
        return sound;
    }
}

然后,您可以在已知枚举(
Favorite.dog.makeSound()
)上调用该方法,或者如果该枚举是另一个方法的参数。

最大的优点是
enum
类型安全的。
enum
值只能接受一个定义的值(或
null
)。(注意,java中的<代码>枚举< /C> >在C++或C语言中不象<代码> EnUM <代码>,它更像是<代码> INT/COM>的别名。

如果使用
String
int
之类的类型,则可以为该类型分配
String
int
中适合的任何值,即使它不是您希望它包含的有限值集之一


它还使程序更易于阅读,因为例如,当一个方法将
枚举
类型作为参数时,您立即知道它的含义,以及哪些值是有效的-例如,如果它将采用
字符串
,您不会自动知道哪些字符串是有效输入,哪些不是。

枚举很容易为代码添加新功能。字符串有其局限性,您可以自行决定是否需要枚举的所有好处,或者字符串是否适合此工作

例如:

public enum favourite { dog, cat, cow; public boolean barking(){ switch(this){ case dog: return true; case cat: case cow: return false; } throw new AssertionError(); } } 公众最爱{ 狗、猫、牛; 公共布尔吠叫(){ 开关(本){ 个案犬: 返回true; 案例类别: 案例牛: 返回false; } 抛出新的断言错误(); } }
Enum创建名称空间的排序。因此,具有相同名称的两个常量可以属于不同的枚举。当然,您可以使用ArrayList来模拟它,但它不是直观的,因为它应该充当一个容器,而不是一个包含常量的逻辑名称空间

您可以比较C++中的旧式枚举,其中包含相同命名常量的两个枚举声明显示错误。在C++中使用<强>新类枚举< /强>向它添加了命名空间的类型,这是不可能的。

是的 Java中的枚举已具有名称间隔功能。
顺便说一句,Enum和ArrayList都有不同的用途。

Enum的最大优点是它们是类型安全的:Enum类型的变量只能保存在该Enum中定义的值。顺便说一下,在某些情况下,这可能是一个很大的缺点,甚至是一个显示障碍:如果可能的值在编译时未知(例如,因为您需要在运行时从数据库中获取它们),则不能使用枚举

虽然我没有看到它的明显优势(如果我没有看到明显的优势,我将始终使用既定的编码实践,即使用枚举),但您当然可以使用字符串作为枚举的一种。由于字符串比较,性能可能会稍差一些,但在大多数情况下,这是不明显的

但是,出于以下原因,我建议您不要使用数组示例:

  • 数组是可变的。如果您的项目足够大,最终会有人编写
    收藏夹[0]=“啤酒”
    并因此在代码的不相关部分中引起神秘的bug
  • 使用数组在可读性方面没有优势。含义
    String myFavorite=favorites[1]是完全不透明的,而
    String myFavorite=“cat”
    收藏夹myFavorite=Favorite.CAT立即清除
  • 字符串文字可用于
    开关
    语句,但不能用于
    收藏夹[2]
    之类的表达式。所以
    switch(myFavorite){case favorites[2]:…}
    不是合法的Java(而
    switch(myFavorite){case“alien”:…}
    是合法的)
如果确实要将字符串用作枚举,请定义字符串常量:

public static final String FAV_DOG = "dog";
public static final String FAV_CAT = "cat";
public static final String FAV_ALIEN = "alien";

一个原因可能是数组是可变的。您或使用API的人可以随意修改其内容。如果这些值是常量,那么就不需要使用数组,因为您希望它们很少或永远不会更改。如果能够在开关中使用它们,目的就更明确了。字符串[]的工作方式与枚举不同,它不会创建新的类型。@Natecat您可以从java开始在
switch
中使用字符串7@AhmadWabbi但是你向后输了compatbility@Natecat谁在乎呢<代码>枚举
本身在Java 5之前是不存在的。枚举的最大优点是它能够比字符串数组多得多。比如什么?使用
枚举
可以做什么
public static final String FAV_DOG = "dog";
public static final String FAV_CAT = "cat";
public static final String FAV_ALIEN = "alien";