0


比起睡觉,我更喜欢刷巨详细的Java枚举类,这是来自猿人的自觉呀

零基础学习之Java枚举类

概述

枚举类是Java类中一个特殊的类,它是用来专门解决某些类型的对象是有限的几个的场景。这样的场景在我们的生活中非常常见,比如:人的性别(男,女),一年的月份(1月…12月),一年的季节(春夏秋冬),一周内天的表示法(周一…周日),彩虹的颜色(红…紫)等等,所以枚举类在实际生活中尤其的有用。

专业点说就是:枚举类型本质上也是一种类,只不过是这个类的对象是固定的几个,而不能随意让用户创建。

Java枚举类是在JDK1.5新增的类。在JDK1.5之前,需要程序员自己通过特殊的方式来定义枚举类型。在JDK1.5之后,Java支持enum关键字来快速的定义枚举类型。

下面将以JDK1.5为界限对Java枚举类进行说明

JDK1.5之前

创建枚举类

在该阶段如果想要实现一个类对外提供固定个数得对象(枚举类)的功能,需要通过程序员自己的逻辑创建类,其创建要求如下:

  • ①必须将构造器私有化
  • ②需要设置若干个公有的静态常量(想要提供的对象)
  • ③类中得对象,一定要设置为常量,不能被修改
  • ④类中如果有属性,属性不能提供set方法(防止被修改)

代码示例

Person类

packagecom.atguigu.bean;publicclassPerson{privateint id;privateString name;privateGender gender;//对象关联publicPerson(){}publicintgetId(){return id;}publicvoidsetId(int id){this.id = id;}publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicGendergetGender(){return gender;}publicvoidsetGender(Gender gender){this.gender = gender;}}

实现枚举类的功能

packagecom.atguigu.bean;publicclassGender{//方法一:常用的publicstaticfinalGender BOY =newGender("男孩");publicstaticfinalGender GIRL =newGender("女孩");privatefinalString value;privateGender(String value){this.value=value;}publicStringgetValue(){return value;}/*  
方法二 
    public static final Gender BOY;
    public static final Gender GIRL;

    static {
        BOY = new Gender();
        GIRL = new Gender();
    }

    public Gender() {
    }*//* 
方法三  
    public static final Gender BOY =new Gender();
    public static final Gender GIRL =new Gender();

    public Gender() {
    }

    public static Gender getBOY() {
        return BOY;
    }

    public static Gender getGIRL() {
        return GIRL;
    }*/}

测试类

packagecom.atguigu.demo;importcom.atguigu.bean.Gender;importcom.atguigu.bean.Person;publicclassDemo2{publicstaticvoidmain(String[] args){Person person =newPerson();
        person.setId(10);
        person.setName("张三");
        person.setGender(Gender.BOY);System.out.println(person.getName()+"的性别是:"+person.getGender().getValue());}}

JDK1.5之后

创建枚举类

在JDK.5之后,Java提供了enum关键字来快速的定义枚举类型,这样枚举类实现起来就非常方便了。其实现语法如下:

【修饰符】 enum 枚举类名{
    常量对象列表
}

【修饰符】 enum 枚举类名{
    常量对象列表;
    
    其他成员列表;}

虽然方便实现了,但是该方法实现枚举类也有很多需要注意的点:

  • ①枚举类的构造器默认是私有的,并且必须是私有的
  • ② 直接写对象名即可(对象与对象之间采用逗号隔开,最后使用分号)
  • ③ 默认是采用无参构造器(后期可以设置)
  • ④ 对象默认就是共有的静态的常量
  • ⑤ 对象列表必须在类的首行
  • ⑥ 如果显示的创建了有参的构造器,没有无参构造器对象的创建就需要使用有参构造器 ,每个对象后面加小括号
  • ⑦ JDK1.5之后switch,提供支持枚举类型,case后面可以写枚举常量名

代码示例

枚举类

packagecom.atguigu.bean;publicenumGender2{//    BOY,GIRL; 无参BOY("男孩"),GIRL("女孩");//必须在第一行privateString value;Gender2(String value){this.value =value ;}publicStringgetValue(){return value;}@OverridepublicStringtoString(){return  value;}}

测试类

packagecom.atguigu.demo;importcom.atguigu.bean.Gender2;publicclassDemo3{publicstaticvoidmain(String[] args){Gender2 gender2 =Gender2.BOY;//通过类名可以调用说明是静态的,跨包是共有的//    Gender2.BOY = Gender2.Girl; 不可以更改说明是常量System.out.println(gender2.getValue());//返回该枚举类所有的常量对象,(后面会说到这个方法)Gender2[] gender21 =Gender2.values();for(int i =0; i < gender21.length; i++){switch(values[i]){case BOY:System.out.println(values[i]+":男孩");break;case GIRL:System.out.println(values[i]+":女孩");break;}}}

枚举类继承父类

基本介绍

枚举类默认继承的是java.lang.Enum类,因此不能再继承其他的类。继承了Enum类的枚举类默认有以下几种方法:

name();//获取对象的名称toString();//返回也是对象的名称,自定义的枚举类可以再次重写ordinal();//返回当前对象的位置(角标)staticvalues();//返回该枚举类所有的常量对象staticvalueOf(String name);//根据字符串的名称,返回常量对象

注:枚举类也不能被其他类继承

代码示例

测试类

packagecom.atguigu.demo;importcom.atguigu.bean.Gender2;publicclassDemo3{publicstaticvoidmain(String[] args){Gender2 gender2 =Gender2.BOY;//获取对象的名称System.out.println(gender2.name());//返回也是对象的名称,自定义的枚举类可以再次重写System.out.println(gender2.toString());//返回当前对象的位置(角标)System.out.println(gender2.ordinal());//返回该枚举类所有的常量对象Gender2[] gender21 =Gender2.values();for(int i =0; i < gender21.length; i++){System.out.println(gender21[i]);}//根据字符串的名称,返回常量对象String str ="BOY";Gender2 gender22 =Gender2.valueOf(str);System.out.println(gender22);}}

枚举类实现接口

基本介绍

枚举类虽然不能继承其他的类,但是枚举类也是类,可以实现接口,可以同时实现多个接口。可以统一实现,也可以用匿名内部类的形式,单独给某个常量对象实现抽象方法。

修饰符 类名 implements 接口名{}

注意:

  • 枚举类提供的对象个数是确定的,并且在类加载的时候对象已经产生了。所以,抽象方法的实现,可以将范围缩小到某个对象
常量对象 【(实参列表)】{
    对父级做扩展
}
  • 当枚举类中所有的对象都单独对抽象方法做了实现,那么公有的实现就可以删除

代码示例

publicenumGender3implementsEat{BOY("男孩"){@Overridepublicvoideat(){System.out.println("男孩吃的多");}},GIRL("女孩"){@Overridepublicvoideat(){System.out.println("女孩吃的多");}};}interfaceEat{voideat();}

枚举类实现单例模式

基本介绍

如果枚举类的对象只有一个,那么可以作为单例模式的实现。这是因为单例模式约束一个类只能实例化一个对象。目前来说在Java中,为了强制只实例化一个对象,最好的方法是使用一个枚举量。

在 Java 中使用枚举作为单例有以下几个原因:

  • 自由序列化。
  • 保证一个实例(即使通过反射也不能实例化超过一个枚举。)
  • 线程安全

代码示例

publicclassSingleton{publicstaticvoidmain(String[] args){Singleton singleton1  =Singleton.INSTANCE;Singleton singleton2  =Singleton.INSTANCE;System.out.println(singleton1  == singleton2  );System.out.println("singleton1 ,hashCode= "+ singleton1.hashCode());System.out.println("singleton2 ,hashCode = "+ singleton2.hashCode());

        singleton1.sayOK();}}enumSingleton{
    INSTANCE;publicvoidsayOK(){System.out.println("ok~");}}

本文转载自: https://blog.csdn.net/weixin_44480968/article/details/122148816
版权归原作者 Faith_xzc 所有, 如有侵权,请联系我们删除。

“比起睡觉,我更喜欢刷巨详细的Java枚举类,这是来自猿人的自觉呀”的评论:

还没有评论