Java核心技术Ⅰ
中提到了枚举类自定义分方法,在示例代码中,定义enum Size
类代码如下
enum Size
{
SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");
private Size(String abbreviation) { this.abbreviation = abbreviation;}
public String getAbbreviation() { return abbreviation;}
private String abbreviation;
}
这里出现了一个SMALL("S")的东西,SMALL是枚举类中的实例,但是括号是什么意思?
在查了一些博客后,翻到了java自己的Tutorials(教程),中间解释了括号的作用,下面把这部分内容贴出来。
原文地址:https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
……Java编程语言中的枚举类型要比其他语言中的同样类型强大的多。enum
定义了一个称之为enum type
的类。这个类中可以包含方法和其他域。在默认中,编译器会自动的为枚举类添加一些方法。例如,枚举类含有静态方法values
来获取按声明顺序的,包含所有定义值的数组。这个方法常常与for-each结构同时使用,来遍历枚举类型的值。例如,这个代码从Planet
类中遍历太阳系所有行星。
for (Planet p : Planet.values()) {
System.out.printf("Your weight on %s is %f%n",
p, p.surfaceWeight(mass));
}
在下面的示例中,Planet
是代表太阳系中行星的枚举类型。这里它们的定义还包括恒定质量和半径。
每个枚举常量都用质量和半径参数来声明。当常量被创建时,这些值会传给构造器。Java要求这些常量必须定义在所有域和方法之前,具有最高优先级。并且,如果枚举类型中定义了其他的方法和域,这些常量声明的要以;
结尾。
注:构造器必须是包私有或私有访问。
除了它的属性和构造函数之外,Planet
还具有能够允许你取得每个星球的质量的表面重力的方法,这里有一段实例代码来计算你的体重。
public enum Planet {
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6),
JUPITER (1.9e+27, 7.1492e7),
SATURN (5.688e+26, 6.0268e7),
URANUS (8.686e+25, 2.5559e7),
NEPTUNE (1.024e+26, 2.4746e7);
private final double mass; // in kilograms
private final double radius; // in meters
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
private double mass() { return mass; }
private double radius() { return radius; }
// universal gravitational constant (m3 kg-1 s-2)
public static final double G = 6.67300E-11;
double surfaceGravity() {
return G * mass / (radius * radius);
}
double surfaceWeight(double otherMass) {
return otherMass * surfaceGravity();
}
public static void main(String[] args) {
//Java主函数参数args中不包含程序名字,args[0]即为输入参数
if (args.length != 1) {
System.err.println("Usage: java Planet <earth_weight>");
System.exit(-1);
}
double earthWeight = Double.parseDouble(args[0]);
double mass = earthWeight/EARTH.surfaceGravity();
for (Planet p : Planet.values())
System.out.printf("Your weight on %s is %f%n",
p, p.surfaceWeight(mass));
}
}
如果你运行这个Planet.class
,获得输出
$ java Planet 175
Your weight on MERCURY is 66.107583
Your weight on VENUS is 158.374842
Your weight on EARTH is 175.000000
Your weight on MARS is 66.279007
Your weight on JUPITER is 442.847567
Your weight on SATURN is 186.552719
Your weight on URANUS is 158.397260
Your weight on NEPTUNE is 199.207413
可以看到,Java中枚举类中声明常量时可以添加任意个参数,而这些参数是通过括号形式跟在常量后面。这些声明的参数可以作为枚举常量额外的属性使用,但是一定要在后面添加相应类型的变量来接受这些参数,并且,构造器中输入参数也要与声明中的参数匹配。
总结:
- 自定义枚举类中的括号是用来添加常量额外的参数
- 枚举类中要添加参数对应的域(变量)
- 构造器中输入的参数要与声明的顺序、数量匹配
- 枚举类中域声明为
private final
,保证安全