在枚举类之前,定义常量可以在类中定义,也可以在接口中定义。
类常量
在类中定义一组常量:
public class SeasonConst {
public static final int SPRING = 1;
public static final int SUMMER = 2;
public static final int AUTUMN = 3;
public static final int WINTER = 4;
}
接口常量
在接口中,属性都是以public static final修饰。
在接口中定义一组常量:
public interface SeasonConst {
int SPRING = 1;
int SUMMER = 2;
int AUTUMN = 3;
int WINTER = 4;
}
//在接口中,属性都是以public static final修饰
从类常量与接口常量定义上来看,显然接口常量更加简洁;
此外接口中还可以再定义接口,使得有同一类型关系的常量划分为一组。
public interface Const {
interface Season {
int SPRING = 1;
int SUMMER = 2;
int AUTUMN = 3;
int WINTER = 4;
}
interface Week {
int MONDAY = 1;
int SUNDAY = 7;
}
}
//可以直接调用Const.Season.SPRING获得值
接口常量在定义与使用十分方便,但不适用于在有实现类的时候这样使用,
如果有定义的实现类,那么也就是实现了这个接口的所有常量,无论是否在实现类中使用到,都是违背Java的封装性的。
枚举类
在JDK1.5之前没有枚举类,那之前一般使用接口常量代替;而现在Java枚举类可以更贴近地表示常量。
public enum Season {
SPRING,
SUMMER,
AUTUNM,
WINTER;
}
枚举类中的枚举成员都可以看作是这个enum枚举类的实例,这些枚举类默认都被public static final修饰;成员之间用逗号分隔,分号语句结束。
枚举类的调用通过枚举类型名直接引用,如Season.SPRING。
Season season = Season.SPRING;
自定义枚举类型
按照数字1代表SPRING,2代表SUMMER,3代表AUTUMN,4代表WINTER。
public enum Season {
SPRING(1),
SUMMER(2),
AUTUMN(3),
WINTER(4);
private int i;
private Season(int i) {
this.i = i;
}
}
//自定义枚举类型时,必须先定义枚举实例
//枚举类构造方法是私有的,结构对应枚举实例
枚举类提供的方法
values(),以数组形式返回枚举类的所有成员。
valueOf(),将普通字符串转换为枚举实例。
compareTo(),比较两个枚举成员在定义时的顺序。
ordinal(),获取枚举成员的索引位置。
Season[] seasons = Season.values();
Season season = Season.valueOf("SPRING");