java 枚举类型

 

一,什么是枚举类型?

      枚举类型是由一组固定的常量组成的合法值得类型(其实也是一个类),枚举类型是Java1.5发行版本中增加的两个新的引用类型家族中的一个(另外一个是注解类型annotation type)。

     java枚举类型的基本想法非常简单:它们就是通过共有的静态的final域为个枚举常量导出实例的类。

    简单的枚举类型定义:

 

    Public enum Color{  
    RED,BLUE,BLACK,YELLOW,GREEN  
    } 

  从上面可以看出来enum很像特殊的class,实际上enum声明定义的类型就是一个类。 而这些类都是类库中Enum类的子类(java.lang.Enum)。它们继承了这个Enum中的许多有用的方法。我们对代码编译之后发现,编译器将 enum类型单独编译成了一个字节码文件:Color.class。

 

二,为什么要使用枚举类型?

     在java还没有映入枚举类型之前,表示枚举类型的常用模式是声明一组具有名字的int常量(类似的还有string 枚举,其实都一样只是类型不同,现在在很多程序中还可以看见),每个类型成员的一个常量:

   

public static final int APPLE_FUJT=0;
public staitc final int APPLE_PPIN=1;
public static final int ORANGE_NAGVEL=0;
public static final int ORANGE_TEMPLE=1;

  采用这种int枚举模式的程序是十分脆弱的。因为int枚举是编译时常量(编译时候值就确定了),被编译到使用它们的客服端中,如果与枚举常量关联的int发生了变化,客服端就必须从新编译。它会导致初级用户把int 常量硬编码到客服端中而且如果出错的时候比如:需要APPLE_FUJT的时候你传入了ORANGE_NAGVEL编译器是不会报错的,程序不正常然后去debug的时候也比较难找到错误。Java1.5开始就有了另外一种可以体态的解决方案,可以避免int枚举模式的缺点,并提供额外的好处--就是Java枚举类型。

 

public enum Apple{ FUJT,PIPPIN,GRANNY_AMITH }
public enum Orange{ NAVEL ,TEMPLE,BLOOD }

枚举提供了编译时的类型安全,如果声明一个参数类型为Apple,就可以保证,被传到该参数的任何非Null 的对象引用一定属于三个有效的Apple值之一。试图传递类型错误的值的时候编译器就会报错。

 

三,怎么使用枚举?

   a.最基本的枚举

     可以和switch搭配使用

   

enum Car {
   lamborghini,tata
}
public class Main {
   public static void main(String args[]){
      Car c;
      c = Car.tata;
      switch(c) {
         case lamborghini:
         System.out.println("You choose lamborghini!");
         break;
         case tata:
         System.out.println("You choose tata!");
         break;
         default:
         System.out.println("I don't know your car.");
         break;
      }
   }
}

 

  b.复杂一点的枚举

   枚举除了完善了int枚举模式的不足之外,枚举类型还允许添加任意的方法和域(field),并实现任意的接口(把枚举理解成一个java类就很容易想到了)。那么我们为什么要将方法添加到枚举类型中呢?首先,你可能是想将数据与他的常量关联起来 比如太阳系的8课行星。每颗行星都有质量和半径,通过这两个属性可以计算出它表明的重力。从而给定物体的质量,就可以计算出一个物体在行星上面的重力

 

public enum Planet{
     MERCURY(3.302e+23,2.439e6),   //调用构造方法创建一个名为MERCURY的实例
     VENUS(4.869e+24,6.052e6),
     EARTH(5.795e+24,6.378e6);
   
    private final double mass;
    private final double radius;
    private final double surfaceGravity;
    private static final double G=6.67300E-11;   
    Planet(double mass,double radius){
        this.mass=mass;
        this.radius=radius;
        surfaceGravity=G*mass/(radius*radius);
   } 
   public double surfaceWeight(double mass){
      return mass * surfaceGravity;  
   }

}

/****客户端***********/
public class WeightTable{
    public static void main(String[] args){
          double earthWeight=Double.parseDouble(args[0]);
          double mass=earthWeight/Planet.EARTH.surfaceGravity();
           for(Planet p: Planet.values()){
               System.out.println("weight on %s is %f%n",p,p.serfaceWeight(mass));
           }
     }
}

 

   其实只要理解枚举是一个普通的java类就很容易理解java 枚举的使用了。

  

注:以上的知识点大多来自《Effective java》(java程序员必读),如果想更深入的了解建议看看原书和其它资料。部分例子来之与网上其它博客。如果有说的不对的地方欢迎大神指点。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值