标签:
枚举的语法【代码1】
package com.enumtest; public enum Color { RED,BLUE,BLACK,YELLOW,GREEN //注意这里可以没有分号 }enum是用来声明枚举的关键字,声明定义的类都隐含继承了一个父类(java.lang.Enum<E>),因此枚举不能再继承,但仍可实现接口。
package com.enumtest; public final class Color extends java.lang.Enum{ public static final Color RED; public static final Color BLUE; public static final Color BLACK; public static final Color YELLOW; public static final Color GREEN; static {}; public static Color[] values(); public static Color valueOf(java.lang.String); }3.所有枚举类都继承了Enum的方法,下面我们详细介绍这些方法。
5. 注意以下区别:
【代码3】
enum Color3{} enum Color4 { RED } enum Color5 { RED; } enum Color6 { RED; public void test(){} } enum Color7 { public void test(){} // RED; //错误!!!! } enum Color8 { ; public void test(){} }在enum Color3中是一个空的枚举;在enum Color4和Color5中有一个RED的枚举值,后面可以加分号或者不加分号;如果在枚举值后面添加方法,那么在枚举值的最后添加一个分号,如enum Color6;如果像enum Color7一样想把枚举值定义在方法后面是非法的,编译器会提示错误;当然也可以像enum Color8一样定义,注意方法test()之前的分号。
枚举的用法
(1) 常用于对同一类常量进行分类。见代码1.
(2) 声明接口方法时,输入参数类型采用枚举比用原始类型值常量更严谨.
(3) 常量有时往往不仅仅只是一个值,有可能会包含多个属性,此时很适合用枚举
(4) 有时常量对象需要从配置文件中读取其描述信息或者UI显示信息,此时也适合用枚举
(5) 从Java语法层面来说,枚举可以在switch使用,在if中可直接进行比较 。
【代码4】
package com.enumtest; public enum Color { RED,BLUE,BLACK,YELLOW,GREEN; //注意这里有分号 public static void valuePrint(Color color) { switch(color) { case RED: System.out.println(RED); break; case BLUE: System.out.println(BLUE); break; case BLACK: System.out.println(BLACK); break; case YELLOW: System.out.println(YELLOW); break; case GREEN: System.out.println(GREEN); break; default: break; } } public static void main(String args[]) { Color color = Color.RED; valuePrint(color); EnumTest.valuePrint(color); } } class EnumTest { public static void valuePrint(Color color) { switch(color) { case RED: System.out.println(Color.RED);//注意这里的Color.RED不能写成RED,而case中的必须写成RED。 break; case BLUE: System.out.println(Color.BLUE); break; case BLACK: System.out.println(Color.BLACK); break; case YELLOW: System.out.println(Color.YELLOW); break; case GREEN: System.out.println(Color.GREEN); break; default: break; } } }运行结果:
RED RED(6) 声明枚举属性时最好用public final修饰,使用起来会非常方便
package com.enumtest; public enum Color2 { RED("红色",1),BLUE("蓝色",2),BLACK("黑色",3),YELLOW("黄色",4),GREEN("绿色",5); public final String name; public final int index; private Color2(String name, int index) { this.name = name; this.index = index; } public static String getName(int index) { for(Color2 c: Color2.values()) { if(c.getIndex() == index) { return c.name; } } return null; } public static void main(String[] args) { System.out.println(getName(1)); } public String getName() { return name; } public int getIndex() { return index; } }运行结果:红色
package com.enumtest; public enum Color2 { RED("红色",1),BLUE("蓝色",2),BLACK("黑色",3),YELLOW("黄色",4),GREEN("绿色",5); public final String name; public final int index; private Color2(String name, int index) { this.name = name; this.index = index; } public static String getName(int index) { for(Color2 c: Color2.values()) { if(c.getIndex() == index) { return c.toString(); } } return null; } public static void main(String[] args) { System.out.println(getName(1)); } @Override public String toString() { return this.index+"_"+this.name; } public String getName() { return name; } public int getIndex() { return index; } }(9)实现接口。所有的枚举都继承自java.lang.Enum类。由于java不支持多继承,所以枚举对象不能再继承其他的类。
package com.enumtest; public interface Behaviour { void print(); String getInfo(); }【代码8】
package com.enumtest; public enum Color9 implements Behaviour { RED("红色",1),BLUE("蓝色",2),BLACK("黑色",3),YELLOW("黄色",4),GREEN("绿色",5); public final String name; public final int index; private Color9(String name, int index) { this.name = name; this.index = index; } @Override public void print() { System.out.println(this.index+":"+this.name); } @Override public String getInfo() { return this.name; } }(10) 可以创建一个enum类,把它看做一个普通的类。除了它不能继承其他类。(Java是单继承,它已经继承了Enum),可以添加其他的方法,覆盖它本身的方法。
package com.enumtest; public enum Color { RED,BLUE,BLACK,YELLOW,GREEN; //注意这里有分号 public void print() { for(Color c : Color.class.getEnumConstants()) { System.out.println(c.toString()); } } public static void main(String args[]) { Color.RED.print(); } }(12) 无法从enum继承子类,如果需要扩展enum中的元素,在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组。达到将枚举元素进行分组。
package com.enumtest; public interface Food { enum Coffee implements Food { BLACK_COFFEE, DECAF_COFFEE,LATTE; } enum Dessert implements Food { FRUIT,CAKE,GELATO; } }(13) java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。
package com.enumtest; import java.util.EnumMap; import java.util.EnumSet; import java.util.Set; public class LightTest { public enum Light{ RED(1),GREEN(2),YELLOW(3); public final int nCode; private Light(int nCode) { this.nCode = nCode; } } public static void testTraversalEnum() { Light[] allLight = Light.values(); for(Light aLight:allLight) { System.out.println(aLight.name()+" "+aLight.ordinal()+" "+aLight); } } public static void testEnumMap() { EnumMap<Light,String> currEnumMap = new EnumMap<Light,String>(Light.class); currEnumMap.put(Light.RED, "红色"); currEnumMap.put(Light.GREEN, "绿色"); currEnumMap.put(Light.YELLOW, "黄色"); Set<Light> set = currEnumMap.keySet(); for(Light aLight:set) { System.out.println(aLight.name()+" "+aLight.ordinal()+" "+aLight); } } public static void testEnumSet() { EnumSet<Light> currEnumSet = EnumSet.allOf(Light.class); for(Light aLightSetElement : currEnumSet) { System.out.println(aLightSetElement); } } public static void main(String[] args) { testTraversalEnum(); testEnumMap(); testEnumSet(); } }运行结果:(略)
标签:
原文地址:http://blog.csdn.net/u013256816/article/details/50562905