将JAVA 中的enum类型与数据和方法关联起来

来源:互联网 发布:淘宝拍摄产品多少钱 编辑:程序博客网 时间:2024/05/21 22:21
    创建枚举类型要使用enum关键字,隐含了所创建的类型都是java.lang.Enum类的子类,它是抽象类。其中,枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
public enum Size{
        SMALL,
        MEDIUM,
        LARGE;
}
实际上调用了三次构造函数:
new Enum<Size>("SMALL",100);
new Enum<Size>("MEDIUM",150);
new Enum<Size>("LARGE",200);
值的名字和顺序值可以分别通过name()/toString()、ordinal()获得。
values()可以用来遍历枚举类中的值,valueOf(String name)可以用来通过名字获得具体的枚举值。

  为什么要将方法或者域添加到枚举类型中呢?可能是想将数据与它的常量关联起来。可以利用任何适当的方法来增强枚举类型。枚举类型可以作为一个枚举常量的一个简单集合,随着时间的推移再演变成全功能的抽象。
      举个例子:比如太阳系的8颗行星。每颗行星都有质量和半径,通过这两个属性可以就算它的表面重力。从而给定物体的质量就可以计算出一个物体在行星表面的重量。下面就是这个枚举,每个枚举常量后面括号中的数值是传递给构造器的参数。
       在Planet这个枚举类型中为了将数据和枚举常量关联起来得声明实例域,并编写一个带有数据并将数据保存在域中的构造器。枚举是不可变的,所以将所有的域声明为final的。构造器计算和保存表面重力,但这正是一种优化,每当surfaceWeight方法用到重力时,都会根据行星的质量和半径重新计算,并返回它在该常量所表示的行星上的重量。
       注意:虽然在Enum中有构造器,但是我们无法在自定义的枚举类中调用它,直接继承java.lang.Enum也是不允许的。我们自己定义的构造器只能被定义成private或者package-protected,同样在我们也无法调用这个自定义的构造器。

public class EnumDemo {

public static void main(String[] args) {
double earthWeight = 185;
double mass = earthWeight / Planet.EARTH.surfaceGravity();
for (Planet p : Planet.values()) {
System.out.printf("Weight on %s is %f\n", p, p.surfaceWeight(mass));
}
}

}

 enum Planet {
MERCURY(3.302e+23, 2.439e6),
VENUS(4.869e+24, 6.052e6),
EARTH(5.975e+24, 6.378e6),
MARS(6.419e+23, 3.393e6),
JUPITER(1.899e+27, 7.149e7),
SATURN(5.685e+26, 6.027e7),
URANUS(8.683e+25, 2.556e7),
NEPTUNE(1.024e+26, 2.477e7);
private final double mass;
private final double radius;
private final double surfaceGravity;
private static final double G = 6.67300E-11;
private Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
surfaceGravity = G * mass / (radius * radius);
}
public double mass() {return mass;}
public double radius() {return radius;}
public double surfaceGravity() {return surfaceGravity;}
public double surfaceWeight(double mass) {
return mass * surfaceGravity;
}
}

运行结果:
Weight on MERCURY is 69.912739
Weight on VENUS is 167.434436
Weight on EARTH is 185.000000
Weight on MARS is 70.226739
Weight on JUPITER is 467.990696
Weight on SATURN is 197.120111
Weight on URANUS is 167.398264
Weight on NEPTUNE is 210.208751
原创粉丝点击