在枚举值声明完毕之后应该有一个分号:
public enum MyColor {
RED ,
private MyColor () {
}
}
打下横线的地方表示有错误产生。
修改方式:将逗号该为分号。
public enum MyColor {
RED ;
private MyColor() {
}
}
但是如果一个枚举类当中只有枚举值那么就可以不使用分号,也可以不使用逗号。
public enum MyColor {
RED
}
枚举值之所以能声明,是因为该枚举类当中有相对应的构造方法:
上一个例子之所以能声明是因为在一个类当中,如果我们没有手动的写一个构造方法,编译器会自动给我们添加一个无参数的构造方法,所以它没有出现错误。也就是说 RED 与一个无参数的构造函数相对应。
我们怎么样来验证这一点呢?
public enum MyColor {
RED ( "red" );
}
看见了么?现在 RED 的下横线。说明出现了错误。说明它找不到一个参数为 String 类型的构造方法。所以报告了一个编译时错误。
修改如下:
public enum MyColor {
RED ( "red" );
private MyColor(String s) {}
}
好了,现在就没有错误报告了。编译通过。
枚举跟类一样,当你手动为它添加了一个含参构造方法,那么编译器不会在自作聪明为你添加一个无参构造方法。编译器可能是这样想的,既然你重新写了一个有参的构造方法,那么说明我的这个无参的构造方法就没有用了。
何以为证?
public enum MyColor {
RED ( "red" ), // 表示找到与之匹配的无参构造函数,
BLUE (), // 如果是无参,后面的括号为可选
YELLOW ( "yellow" ), // 表示找到一个有参构造方法
GREEN ; // 虽然分号可有可无,但是这个只是针对这个类中没有显示的写出构造方法之前可以使用。
// 分号表示声明完毕
// private MyColor() {
//
// }
private MyColor(String yellow) {}
}
当我把那个无参构造方法的注释去掉,那么之前错误的下横线就会消失。ok pass。
在一个枚举类当中,枚举值之前除了有注释语句之外,不能有其它的任何代码。否则会报告一大堆乱七八糟的错误,其实它就是以为你在声明枚举值。 还有就是如果你创建了一个枚举类,然而在这个枚举类中你还没有声明枚举类就去写了非注释性的代码,那么也将出现错误。错误的原因实际上是它认为你在创建枚举值,首先报告int有错,因为它是一个关键字,你可以去掉,然后它报告private修饰符有错,不能修饰枚举值,因为枚举值在枚举当中被要求是public static final的,应该去掉private,坦白的说它就是以为你在声明一个名为age的枚举值。
enum Simpsons {
private int age;
}
那么解决它的办法当然有:
1、
enum Simpsons {
// 声明枚举值
s;
private int age;
}
2、
enum Simpsons {
// 写一个分号,表示枚举值声明完毕,得到一个缺省的枚举值。
;
private int age;
}
public enum MyColor {
int a = 0;
RED ( "red" ), // 表示找到与之匹配的无参构造函数,
BLUE (), // 如果是无参,后面的括号为可选
YELLOW ( "yellow" ), // 表示找到一个有参构造方法
GREEN ; // 虽然分号可有可无,但是这个只是针对这个类中没有显示的写出构造方法之前可以使用。
// 分号表示声明完毕
private MyColor() {}
private MyColor(String yellow) {}
}
看见了吗?出现了很多下横线。
解决方案就是将 int a = 0; 代码删除。
完整代码:
MyColor.java
package enumDemo;
public enum MyColor {
RED ( "red" ), // 表示找到与之匹配的无参构造函数,
BLUE (), // 如果是无参,后面的括号为可选
YELLOW ( "yellow" ), // 表示找到一个有参构造方法
GREEN ; // 虽然分号可有可无,但是这个只是针对这个类中没有显示的写出构造方法及其它代码之前可以使用。
// 分号表示枚举值声明完毕
private MyColor() {}
private MyColor(String yellow) {}
/** 返回此枚举常量的名称,在其枚举声明中对其进行声明。 */
public String getName() {
return this .name();
}
/** 返回枚举常量的声明时序数 */
public int getOrdinal() {
return this .ordinal();
}
/** 比较此枚举与指定对象的顺序 */
public int getCompareTo(MyColor o) {
return this .compareTo(o);
}
}
Color.java
package enumDemo;
public class Color {
public static void main(String[] args) {
// values() 方法: 静态方法,返回一个包含全部枚举值的数组。
MyColor[] mc = MyColor.values ();
for (MyColor mcs : mc) {
System. out .println(mcs.getName());
/**
* 它和使用如下两种方式打印的效果是一样的 <br>
*
* System.out.println(mcs); <br>
*
* System.out.println(mcs.toString());
*/
/** 枚举应用在 switch 中 */
switch (mcs) {
case RED :
System. out .println( "it's red" );
break ;
case BLUE :
System. out .println( "it's blue" );
break ;
case YELLOW :
System. out .println( "it's yellow" );
break ;
default :
System. out .println( "it's green" );
}
}
System. out .println(MyColor. RED .compareTo(mc[1])); // -1
}
}
switch是要在有限的可能值集合中进行选择,因此它与enum正是绝佳的组合。
1632

被折叠的 条评论
为什么被折叠?



