27、安全的枚举类型

1、枚举(Enums)

JDK1.5加入了一个全新类型的“类”-枚举类型。为此JDK1.5引入了一个新关键字enum. 我们可以这样来定义一个枚举类型
public enum Color
{
       Red,
       White,
       Blue
}
然后可以这样来使用Color myColor = Color.Red.

[java] view plain copy print ?
  1. public class ColorTest 
  2.     public static void main(String[] args) 
  3.     { 
  4.         Color myColor = Color.Red; 
  5.          
  6.         for(Color color : Color.values()) 
  7.         { 
  8.             System.out.println(color); 
  9.         } 
  10.     } 


枚举类型提供了两个有用的静态方法values()和valueOf(). 我们可以很方便地使用它们,例如
for (Color c : Color.values()) System.out.println(c);

2、枚举类型可以作为方法参数

[java] view plain copy print ?
  1. public class EnumTest 
  2.     public static void doOp(OpConstant opConstant) 
  3.     { 
  4.         switch(opConstant) 
  5.         { 
  6.         case TURN_LEFT: 
  7.             System.out.println("向左转"); 
  8.             break
  9.         case TURN_RIGHT: 
  10.             System.out.println("向右转"); 
  11.             break
  12.         case SHOOT: 
  13.             System.out.println("射击"); 
  14.             break
  15.         } 
  16.     } 
  17.      
  18.     public static void main(String[] args) 
  19.     { 
  20.         doOp(OpConstant.SHOOT); 
  21.     } 
  22.  
  23. enum OpConstant 
  24.     TURN_LEFT,TURN_RIGHT,SHOOT 


3、定义枚举类型时本质上就是在定义一个类别,只不过很多细节由编译器帮您完成了,所以某些程度上,enum关键字的作用就像是class或interface。

      当您使用“enum”定义 枚举类型时,实质上您定义出來的类型继承自 java.lang.Enum 类型,而每个枚举的成员其实就是您定义的枚举类型的一个实例(Instance)——换句话说,当定义了一个枚举类型后,在编译时刻就能确定该枚举类型有几个实例,分别是什么,在运行期间我们无法在使用该枚举类型创建新的实例了,这些实例在编译期间就已经完全确定下来了。他们都被预设为 final,所以您无法改变他们,他们也是 static 成员,所以您可以通过类型名称直接使用他们,当然最重要的,它们都是公开的(public)。

      我们所定义的每个枚举类型都继承自java.lang.Enum类,枚举中的每个成员默认都是public static final的。

4、既然枚举继承自类Enum,他也有自己的成员变量、构造方法。

[java] view plain copy print ?
  1. public enum Coin 
  2.     penny("hello"),nickel("world"),dime("welcome"),quarter("hello world"); 
  3.      
  4.     private String value; 
  5.      
  6.     public String getValue() 
  7.     { 
  8.         return value; 
  9.     } 
  10.      
  11.     Coin(String value) 
  12.     { 
  13.         this.value = value; 
  14.     } 
  15.     public static void main(String[] args) 
  16.     { 
  17.         Coin coin = Coin.quarter; 
  18.          
  19.         System.out.println(coin.getValue()); 
  20.     } 


这里每个枚举值都是一个Coin类型的实例,括号里面的是构造方法需要的参数,构造方法就是Coin(String value)

5、enum的valueOf方法,返回带指定名称的指定枚举类型的枚举常量。名称必须与在此类型中声明枚举常量所用的标识符完全匹配。(不允许使用额外的空白字符。)。values()方法返回枚举常量的集合

[java] view plain copy print ?
  1. public class ShowEnum 
  2.     public static void main(String[] args) 
  3.     { 
  4.         enumCompareTo(OpConstant.valueOf(args[0])); 
  5.     } 
  6.     public static void enumCompareTo(OpConstant constant) 
  7.     { 
  8.         System.out.println(constant); 
  9.          
  10.         for(OpConstant c : OpConstant.values()) 
  11.         { 
  12.             System.out.println(constant.compareTo(c)); 
  13.         } 
  14.     } 
  15.  
  16. enum OpConstant 
  17.     TURN_LEFT,TURN_RIGHT,SHOOT 


如果运行java ShowEnum SHOOT,打印:射击 2  1  0

compareTo()方法比较此枚举与指定对象的顺序。在该对象小于、等于或大于指定对象时,分别返回负整数、零或正整数。 枚举常量只能与相同枚举类型的其他枚举常量进行比较。该方法实现的自然顺序就是声明常量的顺序。

6、枚举的ordinal()方法,返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

[java] view plain copy print ?
  1. public class ShowEnum2 
  2.     public static void main(String[] args) 
  3.     { 
  4.         for(OpConstant c : OpConstant.values()) 
  5.         { 
  6.             System.out.printf("%d,%s,%n",c.ordinal(),c); 
  7.         } 
  8.     } 


打印:

0,TURN_LEFT,
1,TURN_RIGHT,
2,SHOOT,

7、EnumSet,枚举集合,of()方法与complementOf()方法

[java] view plain copy print ?
  1. import java.util.EnumSet; 
  2. import java.util.Iterator; 
  3.  
  4. enum FontConstant 
  5.     Plain,Bold,Italic 
  6. public class EnumSetDemo 
  7.     public static void main(String[] args) 
  8.     { 
  9.         EnumSet<FontConstant> enumSet = EnumSet.of(FontConstant.Bold,FontConstant.Italic); 
  10.          
  11.         showEnumSet(enumSet); 
  12.         showEnumSet(EnumSet.complementOf(enumSet)); 
  13.     } 
  14.     public static void showEnumSet(EnumSet<FontConstant> enumSet) 
  15.     { 
  16.         for(Iterator<FontConstant> iter = enumSet.iterator();iter.hasNext();) 
  17.         { 
  18.             System.out.println(iter.next()); 
  19.         } 
  20.     } 

noneOf()方法,按照给定的枚举类型生成一个空的枚举集合。

[java] view plain copy print ?
  1. blic class EnumSetDemo2 
  2.     public static void main(String[] args) 
  3.     { 
  4.         EnumSet<FontConstant> enumSet = EnumSet.noneOf(FontConstant.class); 
  5.          
  6.         enumSet.add(FontConstant.Bold); 
  7.         enumSet.add(FontConstant.Italic); 
  8.         showEnumSet(enumSet); 
  9.          
  10.             } 
  11.     public static void showEnumSet(EnumSet<FontConstant> enumSet) 
  12.     { 
  13.         for(Iterator<FontConstant> iter = enumSet.iterator();iter.hasNext();) 
  14.         { 
  15.             System.out.println(iter.next()); 
  16.         } 
  17.     } 

8、copyOf()方法

[java] view plain copy print ?
  1. public class EnumSetDemo3 
  2.     public static void main(String[] args) 
  3.     { 
  4.         List<FontConstant> list = new ArrayList<FontConstant>(); 
  5.          
  6.         list.add(FontConstant.Italic); 
  7.         list.add(FontConstant.Bold); 
  8.          
  9.         showEnumSet(EnumSet.copyOf(list)); 
  10.          
  11.     } 
  12.      
  13.     public static void showEnumSet(EnumSet<FontConstant> enumSet) 
  14.     { 
  15.         for(Iterator<FontConstant> iter = enumSet.iterator();iter.hasNext();) 
  16.         { 
  17.             System.out.println(iter.next()); 
  18.         } 
  19.     } 


9、EnumMap枚举映射:

[java] view plain copy print ?
  1. import java.util.EnumMap; 
  2. import java.util.Map; 
  3.  
  4. public class EnumMapDemo 
  5.     public static void main(String[] args) 
  6.     { 
  7.         Map<Action,String> map =new EnumMap<Action,String>(Action.class); 
  8.          
  9.          
  10.         map.put(Action.TURN_RIGHT, "向右"); 
  11.         map.put(Action.SHOOT, "射击"); 
  12.         map.put(Action.TURN_LEFT, "向左"); 
  13.          
  14.         for(Action action : Action.values()) 
  15.         { 
  16.             System.out.println(map.get(action)); 
  17.         } 
  18.     } 
  19. enum Action 
  20.     TURN_LEFT,TURN_RIGHT,SHOOT 


打印的顺序是固定的,按照枚举Action中的枚举常量的顺序。

10、枚举的实际工程用处:在有限个选择项的环境中,如权限限制有系统管理员、管理员、vip用户、普通用户等,使用枚举

11、静态导入(Static import)   要使用静态成员(方法和变量)我们必须给出提供这个静态成员的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。

静态导入:import static 。。。。;导入要写到方法名和属性名

a) import static com.shengsiyuan.common.Common.Age;
b) import static com.shengsiyuan.common.Common.output;
表示导入Common类中的静态成员变量AGE以及静态方法output。注意:使用import static时,要一直导入到类中的静态成员变量或静态方法

你可能感兴趣的:(java开发工具)