Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1899107
  • 博文数量: 606
  • 博客积分: 9991
  • 博客等级: 中将
  • 技术积分: 5725
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-17 19:07
文章分类

全部博文(606)

文章存档

2011年(10)

2010年(67)

2009年(155)

2008年(386)

分类:

2008-07-19 23:03:42

枚举

在过去,我们必须用整型常数代替枚举,随着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的改进,代码量的问题应该会被淡化。

阅读(208) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~