您的位置:首页 > 编程语言 > Java开发

J2SE 5.0实例---枚举

2005-03-18 12:48 477 查看

枚举

在过去,我们必须用整型常数代替枚举,随着J2SE 5.0的发布,这样的方法终于一去不复返了。
一个简单的枚举类型定义如下:

public enum Weather{
       SUNNY,RAINY,CLOUDY
}

 枚举可以用在switch语句中:

Weather weather=Weather.CLOUDY;switch(weather)
{
       case SUNNY:
              System.out.println("It's sunny");
              break;
       case CLOUDY:
              System.out.println("It's cloudy");
              break;
       case RAINY:
              System.out.println("It's rainy");
              break;
}

 枚举类型可以有自己的构造方法,不过必须是私有的,也可以有其他方法的定义,如下面的代码:

public enum Weather {    SUNNY("It is sunny"),
    RAINY("It is rainy"),
    CLOUDY("It is cloudy");

     private String description;

     private Weather(String description) {
       this.description=description;
    }
   
    public String description() {
       return this.description;
    }
}

 下面一段代码是对这个枚举的一个使用:

for(Weather w:Weather.values()){
    System.out.printf(                                                  "Description of %s is /"%s/"./n",w,w.description());
}

 Weather weather=Weather.SUNNY;
System.out.println(weather.description() + " today");

 如果我们有一个枚举类型,表示四则运算,我们希望在其中定义一个方法,针对不同的值做不同的运算,那么我们可以这样定义:

public enum Operation {     PLUS, MINUS, TIMES, DIVIDE;

         // Do arithmetic op represented by this constant
        double eval(double x, double y){
            switch(this) {
                case PLUS:   return x + y;
                case MINUS:  return x - y;
                case TIMES:  return x * y;
                case DIVIDE: return x / y;
            }
            throw new AssertionError("Unknown op: " + this);
        }
}

 这样写的问题是你如果没有最后一行抛出异常的语句,编译就无法通过。而且如果我们想要添加一个新的运算,就必须时刻记着要在eval中添加对应的操作,万一忘记的话就会抛出异常。
J2SE 5.0提供了解决这个问题的办法,就是你可以把eval函数声明为abstract,然后为每个值写不同的实现,如下所示:

 
public enum Operation {     PLUS   { double eval(double x, double y) { return x + y; } },
     MINUS  { double eval(double x, double y) { return x - y; } },
     TIMES  { double eval(double x, double y) { return x * y; } },
     DIVIDE { double eval(double x, double y) { return x / y; } };

      abstract double eval(double x, double y);
}

 这样就避免了上面所说的两个问题,不过代码量增加了一些,但是随着今后各种Java开发 IDE的改进,代码量的问题应该会被淡化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  j2se string java ide