我应该选择';枚举';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中定义的值。顺便说一下,在某些情况下,这可能是一个很大的缺点,甚至是一个显示障碍:如果可能的值在编译时未知(例如,因为您需要在运行时从数据库中获取它们),则不能使用枚举 虽然我没有看到它的明显优势(如果我没有看到明显的优势,我将始终使用既定的编码实践,即使用枚举),但您当然可以使用字符串作为枚举的一种。由于字符串比较,性能可能会稍差一些,但在大多数情况下,这是不明显的 但是,出于以下原因,我建议您不要使用数组示例:
- 数组是可变的。如果您的项目足够大,最终会有人编写
并因此在代码的不相关部分中引起神秘的bug收藏夹[0]=“啤酒”
- 使用数组在可读性方面没有优势。含义
String myFavorite=favorites[1]代码>是完全不透明的,而
或String myFavorite=“cat”
收藏夹myFavorite=Favorite.CAT代码>立即清除
- 字符串文字可用于
语句,但不能用于开关
之类的表达式。所以收藏夹[2]
不是合法的Java(而switch(myFavorite){case favorites[2]:…}
是合法的)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";