枚举
1. 认识枚举
枚举是一种特殊的类。
public class Test {public static void main(String[] args) {A objX = A.X;System.out.println(objX); // X}
}enum A {// 注意,枚举类的第一行必须罗列枚举对象的名称X,Y,Z;private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}
2. 枚举的特点
- 枚举类的第一行只能罗列一些名称,这些名称都是常量,并且每个常量记住的都是枚举类的一个对象。
- 枚举类的构造器都是私有的(写不写都只能是私有的),因此枚举类对外不能创建对象。
- 枚举都是最终类,不可以被继承。
- 枚举类中,从第二行开始可以定义类的其他各种成员。
- 编译器为枚举类新增了几个方法,并且枚举类都是继承 java.lang.Enum 类的,从 enum 类也会继承到一些方法。
public class Test {public static void main(String[] args) {// 1. 枚举类的构造器是私有的,它不能对外创建对象
// A obj = new A(); // 报错// 2. 枚举类的第一行都是常量(所以可以直接通过"类名.常量名"直接获取),记住的是枚举类的对象A objX = A.X;A objY = A.Y;// 3. 枚举类为我们提供了一些APIA[] all = A.values(); // 获取所有的枚举对象A objZ = A.valueOf("Z"); // 根据枚举的常量名来获得对应的枚举对象System.out.println(objZ.name()); // 输出枚举对象的名称:ZSystem.out.println(objZ.ordinal()); // 输出枚举对象的索引:2}
}enum A {X, Y, Z;
}
3. 抽象枚举(扩展)
public class Test {public static void main(String[] args) {A obj = A.Y;obj.run(); // Jack跑步中...}
}enum A {// 创建对象X、Y的时候,因为run方法是抽象的,所有对象X、Y无法初始化自己的run方法// 因此,我们要调用构造器重写run方法X() {@Overridepublic void run() {}},Y("Jack") {@Overridepublic void run() {System.out.println(getName() + "跑步中...");}};// 抽象的————对象的方法public abstract void run();private String name;// 无参构造器A() {}// 有参构造器A(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
4. 枚举实现单例
public class Test {public static void main(String[] args) {// 通过枚举快速实现单例H obj1 = H.OBJ;H obj2 = H.OBJ;System.out.println(obj1 == obj2); // true}
}enum H {OBJ;
}
5. 枚举常见的应用场景
-
用来表示一组信息,然后作为参数进行传输
(选择定义一个个的常量来表示一组信息,并作为参数传输)
-
参数值不受约束
(选择定义枚举表示一组信息,并作为参数传输)
-
代码可读性好,参数值得到了约束,对使用者更友好,建议使用!
案例展示:
public class Test {// main方法public static void main(String[] args) {check(0); // 检测到为女性用户,将为您推荐xxx}// check方法public static void check(int gender) {switch (gender) {case Constant.female:System.out.println("检测到为女性用户,将为您推荐xxx");break;case Constant.male:System.out.println("检测到为男性用户,将为您推荐yyy");break;}}
}class Constant {// 常量public static final int female = 0;public static final int male = 1;
}
参照上面的案例,用枚举的方法进行改写,代码如下:
public class Test {// main方法public static void main(String[] args) {check(Constant.male); // 使用枚举,能够让对方不能乱传参数进来}// check方法public static void check(Constant gender) {switch (gender) {case male:System.out.println("检测到为女性用户,将为您推荐xxx");break;case female:System.out.println("检测到为男性用户,将为您推荐yyy");break;}}
}enum Constant {male, female;
}