java枚举能存什么用,JAVA枚举的作用与好处
这篇文章给大家聊聊关于java枚举能存什么用,以及JAVA枚举的作用与好处对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
JAVA枚举的作用与好处
枚举是一种规范它规范了参数的形式,这样就可以不用考虑类型的不匹配并且显式的替代了int型参数可能带来的模糊概念枚举像一个类,又像一个数组。
Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class,它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。
1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。
2.所有枚举值都是public, static, final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。
3.Enum默认实现了java.lang.Comparable接口。
4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.
5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。
6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。
7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。
了解了这些基本特性,我们来看看如何使用它们。
1.遍历所有有枚举值.知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。
for(Color c: Color.values())
System.out.println(“find value:”+ c);
2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。
public enum Color{
Red,
Green,
Blue;
private static int number= Color.values().length;
public static Color getRandomColor(){
long random= System.currentTimeMillis()% number;
switch((int) random){
case 0:
return Color.Red;
case 1:
return Color.Green;
case 2:
return Color.Blue;
default: return Color.Red;
}
}
}
可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。
3.覆载(Override)toString, valueOf方法
前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。
….
public String toString(){
switch(this){
case Red:
return"Color.Red";
case Green:
return"Color.Green";
case Blue:
return"Color.Blue";
default:
return"Unknow Color";
}
}
….
这时我们可以看到,此时再用前面的遍历代码打印出来的是
Color.Red
Color.Green
Color.Blue
而不是
Red
Green
Blue.
可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。
4.使用构造函数
虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。
public enum Color{
Red("This is Red"),
Green("This is Green"),
Blue("This is Blue");
private String desc;
Color(String desc){
this.desc= desc;
}
public String getDesc(){
return this.desc;
}
}
这里我们为每一个颜色提供了一个说明信息,然后定义了一个构造函数接受这个说明信息。
要注意这里构造函数不能为public或者protected,从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。
5.实现特定的接口
我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。
6.定义枚举值自己的方法。
前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。
public enum Color{
Red{
public String toString(){
return"Color.Red";
}
},
Green{
public String toString(){
return"Color.Green";
}
},
Blue{
public String toString(){
return"Color.Blue";
}
};
}
从逻辑上来说这样比原先提供一个“全局“的toString方法要清晰一些。
总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个
人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。
java的enum到底有什么用
1.关于 Java Enum
Enum一般用来表示一组相同类型的常量。如性别、日期、月份、颜色等。对这些属性用常量的好处是显而易见的,不仅可以保证单例,且比较时候可以用”==”来替换 equals。是一种好的习惯。 JDK1.5之前没有 Enum这个类型,那时候一般用接口常量来替代。有了 JavaEnum之后,可以更贴近的表示这种常量。
2.如何使用 Java Enum
简单的用法: JavaEnum简单的用法一般用于代表一组常用常量,可用来代表一类相同类型的常量值。如:
//性别
publicenumSexEnum{
male,female;
}
//颜色
publicenumColor{
RED,BLUE,GREEN,BLACK;
}
枚举对象里面的值都必须是唯一的。
可以通过 Enum类型名直接引用该常量,如 SexEnum.male,Color.RED.
复杂用法: Java为枚举类型提供了一些内置的方法,同事枚举常量还可以有自己的方法。可以很方便的遍历枚举对象,看个下面的例子:
WeekDay.java
/**
*@authoradmin
*2015-12-03
*定义一个枚举类型,代表星期一到星期日的7个缩写常量
*同时还定义了枚举类型的属性day,该属性可以是final,也可是变量
*同时还定义了该枚举类型的一个方法printDay
*/
publicenumWeekDay{
Mon("Monday"),Tue("Tuesday"),Wed("Wednesday"),Thu("Thursday"),Fri(
"Friday"),Sat("Saturday"),Sun("Sunday");
/**定义枚举类型自己的属性**/
privatefinalStringday;
privateWeekDay(Stringday){
this.day=day;
}
/**定义枚举类型自己的方法**/
publicstaticvoidprintDay(inti){
switch(i){
case1:System.out.println(WeekDay.Mon);break;
case2:System.out.println(WeekDay.Tue);break;
case3:System.out.println(WeekDay.Wed);break;
case4:System.out.println(WeekDay.Thu);break;
case5:System.out.println(WeekDay.Fri);break;
case6:System.out.println(WeekDay.Sat);break;
case7:System.out.println(WeekDay.Sun);break;
default:System.out.println("wrongnumber!");
}
}
publicStringgetDay(){
returnday;
}
}
WeekDayTest.java
/**
*@authoradmin
*2015-12-03
*测试枚举类型WeekDay.
*/
publicclassWeekDayTest{
publicstaticvoidmain(Stringargs[]){
for(WeekDayday:WeekDay.values()){
System.out.println(day+"====>"+day.getDay());
}
WeekDay.printDay(5);
}
}
输出结果为:
Mon====>Monday
Tue====>Tuesday
Wed====>Wednesday
Thu====>Thursday
Fri====>Friday
Sat====>Saturday
Sun====>Sunday
Fri
java 的枚举可以用泛型吗
有!
泛型和枚举都是JDK1.5版本之后加入的新特性,泛型将程序代码的类型检查提前到了编译期间进行,枚举类型增强了程序代码的健壮性。
1.泛型
在JDK1.5版本之前,如果在集合中添加了不同类型的数据,需要在程序的运行期间对类型之间的转换进行检查。
例如:
List arrayList=new arrayList();
在arrayList中添加String类型的对象和Integer对象,但是我们定义如下一个数组
String[] values=new String[arrayList.size()];
如果想要把arrayList转换成数组的话就会出现错误:
arrayList.toArray(values);//运行期间错误
这是因为List中包含了整型封装类型的对象。但是该错误只能在运行期间才能发现,程序能够正常的通过编译,并不会报错。
对于程序中出现的错误,应该尽早的通知程序员。泛型能够很好地解决这个问题。
1.1泛型在集合中的应用
在JDK1.5版本之后Java提供了对泛型的支持。例如对于一个ArrayList列表来说,如果只想在列表中放入String类型元素,可以用下面的方法来实现:
ArrayList<String> list=new ArrayList<String>();
泛型使得编译器能够在编译期间对集合中加入的对象进行检查,如果加入了不同类型的对象,就会报错,而不必等到运行期间再进行相关的类型转换。
和原来没有使用泛型相比,它将原来需要在运行时期才能发现的异常提前到了编译期间,使得程序的安全性也大大提高,泛型一般用于集合类中。
1.2泛型类和泛型方法
泛型类的定义如下:在类名的后面加上一对尖括号("<>"),在尖括号内部填入需要的类型。例如:
class Point< T>{//此处可以随便写标识符号,T是type的简称
private T var;// var的类型由T指定,即:由外部指定
public T getVar(){//返回值的类型由外部决定,泛型方法
return var;
}
public void setVar(T var){//设置的类型也由外部决定
this.var= var;
}
};
public class GenericsDemo06{
public static void main(String args[]){
Point< String> p= new Point< String>();//里面的var类型为String类型
p.setVar("it");//设置字符串
System.out.println(p.getVar().length());//取得字符串的长度
}
}; 2.枚举
枚举也是JDK1.5之后的版本以后Java新加入的特性。使用枚举可以表示一组常量数据。枚举的本质是一个类,可以使用enum关键字来声明一个枚举类型,其声明方式如下:
[访问控制符] enum枚举类型名{value1,value2,......}
使用枚举类型需要注意以下几点:
枚举类型可以定义在类的内部也可以定义在类的外部。如果定义在类的内部,那么其访问控制符可以是public,protected,private或者默认的控制符。如果定义在类的外部,其访问控制符只能是public和默认控制符;
枚举类型中定义的value值都默认为public static final的。其值一经定义就不能在被修改了。多个value值之间需要用逗号隔开;
枚举类型中除了可以声明常量之外还可以声明方法。但是方法需要在常量之后,并且常量和方法之间要用分号区分;
枚举类型中的值可以通过枚举类型名直接对他们进行访问;
枚举类型不能声明为abstract或者final类型;
例:
public enum Direction{
FORWARD,
BACK,
LEFT;
public void start(){
System.out.println("enum method");
}
}
2.1枚举类型的常用方法
public final String name()//返回枚举常量的名称;
public final int ordinal()//返回枚举常量在枚举类型中的位置,第一个枚举值序号为0,依次类推;
public String toString()//返回枚举常量的名字,可以重写此方法;
public static valueOf(enumType,String name)//返回与name名字相对应的枚举常量;
好了,文章到此结束,希望可以帮助到大家。