1.自定义类实现枚举效果
现在有这么一个需求:
如果想要表示固定数量的固定值的话 用什么类型比较好 如果从已知的类型来看 仿佛什么类型也不太合适 比如用int类型标识的话 不符合我固定数量的固定值的要求
我们假设用一个类去实现这个需求:
在这个类中提供一个私有的构造方法 防止外界随随便便根据这个类创建任意数量的对象 在提供几个公有的常量(几个体现了固定数量这个字眼 常量则体现了固定值这个字眼)
实现如下所示
public class Season{private Season(){}public static final Season SPRING = new Season();public static final Season SUMMER = new Season();public static final Season FALL = new Season();public static final Season WINTER = new Season();
}
public class Main {public static void main(String[] args) {// 然后根据不同的枚举值做出不同的操作// 1.首先通过if-else语句实现这个需求Season s = Season.SPRING;if(s == Season.SPRING){System.out.println("春天");}else if(s == Season.SUMMER){System.out.println("夏天");}else if(s == Season.FALL){System.out.println("秋天");}else if(s == Season.WINTER){System.out.println("冬天");}// 2.如果想要通过switch语句实现判断 显然是不可取的 因为switch语句的()只能储存整型、字符串类型以及枚举类型 这个属于引用类型 因此不能通过switch实现这个判断效果}
}
2.枚举类型
如果只是要求取值为固定数量的固定值的话 那么可以使用枚举类型
枚举就是由固定数量的固定值所组成的
public enum Season{SPRING, SUMMER, FALL, WINTER
}
public class Main {public static void main(String[] args) {// 然后根据不同的枚举值做出不同的操作// 1.首先通过if-else语句实现这个需求
// Season s = Season.SPRING;
// if(s == Season.SPRING){
// System.out.println("春天");
// }else if(s == Season.SUMMER){
// System.out.println("夏天");
// }else if(s == Season.FALL){
// System.out.println("秋天");
// }else if(s == Season.WINTER) {
// System.out.println("冬天");
// }// 2.然后可以通过switch语句实现这个需求Season s = Season.SPRING;switch(s){case SPRING:System.out.println("春天");break;case SUMMER:System.out.println("夏天");break;case FALL:System.out.println("秋天");break;case WINTER:System.out.println("冬天");}System.out.println(s.ordinal());// 你可以打印这个常量值在枚举中的索引System.out.println(s.name());// 你也可以打印这个常量值在枚举中的名称}
}
上述代码中值得注意的是:如果我们要通过switch语句对枚举类型中定义的常量进行判断的话 那么我们可以省略case语句中的枚举名称
1.枚举的使用注意
枚举的本质是类 所有枚举类型都隐式的继承自java.lang.Enum
枚举定义完常量以后 可以继续定义成员变量、方法(但是注意最后一个常量定义完之后需要以分号结尾)
枚举的方法权限必须是无修饰符或者private(其实无修饰符的效果和private的效果一样)
Java会主动调用构造方法来初始化每一个常量 你不能手动调用构造方法(如果Java允许你手动调用构造方法的话 那么就会破坏枚举由固定数量组成的规定 因为你因此可以定义任意数量的固定值)
2.自定义构造方法的枚举
public enum Season{SPRING(5, 15), SUMMER(25, 35), FALL(15, 25), WINTER(-5, 5);// 这边就很明显可以看出常量是通过主动调用构造方法来定义的private int min;// 用于表示季节的最低温度private int max;// 用于表示季节的最高温度Season(int min, int max){this.min = min;this.max = max;}public int getMax(){return max;}public int getMin(){return min;}
}
public class Main {public static void main(String[] args) {Season s = Season.SPRING;System.out.println(s.getMax());System.out.println(s.getMin());}
}