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

Posted Faith_xzc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比起睡觉,我更喜欢刷巨详细的Java枚举类,这是来自猿人的自觉呀相关的知识,希望对你有一定的参考价值。

概述

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

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

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

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

JDK1.5之前

创建枚举类

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

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

代码示例

Person类

package com.atguigu.bean;

public class Person 

    private int id;
    private String name;
    private Gender gender; //对象关联


    public Person() 
    

    public int getId() 
        return id;
    

    public void setId(int id) 
        this.id = id;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public Gender getGender() 
        return gender;
    

    public void setGender(Gender gender) 
        this.gender = gender;
    


实现枚举类的功能

package com.atguigu.bean;


public class Gender 

	//方法一:常用的
    public static final Gender BOY = new Gender("男孩");
    public static final Gender GIRL = new Gender("女孩");

    private final String value;

    private Gender(String value) 
        this.value=value;
    

    public String getValue() 
        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;
    */


测试类

package com.atguigu.demo;

import com.atguigu.bean.Gender;
import com.atguigu.bean.Person;

public class Demo2 
    public static void main(String[] args) 
        Person person = new Person();
        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后面可以写枚举常量名

代码示例

枚举类

package com.atguigu.bean;

public enum Gender2 
//    BOY,GIRL; 无参
    BOY("男孩"), GIRL("女孩"); //必须在第一行

    private String value;

    Gender2(String value) 
        this.value =value ;
    

    public String getValue() 
        return value;
    

    @Override
    public String toString() 
        return  value;

    


测试类

package com.atguigu.demo;


import com.atguigu.bean.Gender2;



public class Demo3 

    public static void main(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(); //返回当前对象的位置(角标)
static values(); //返回该枚举类所有的常量对象
static valueOf(String name); //根据字符串的名称,返回常量对象

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

代码示例

测试类

package com.atguigu.demo;
import com.atguigu.bean.Gender2;

public class Demo3 

    public static void main(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 接口名


注意:

  • 枚举类提供的对象个数是确定的,并且在类加载的时候对象已经产生了。所以,抽象方法的实现,可以将范围缩小到某个对象
常量对象 【(实参列表)
	对父级做扩展

  • 当枚举类中所有的对象都单独对抽象方法做了实现,那么公有的实现就可以删除

代码示例

public enum Gender3 implements Eat 

    BOY("男孩")
        @Override
        public void eat() 
            System.out.println("男孩吃的多");
        
        ,
    GIRL("女孩")
        @Override
    public void eat() 
            System.out.println("女孩吃的多");
        
    ;


interface Eat
    void eat();

枚举类实现单例模式

基本介绍

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

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

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

代码示例

public class Singleton 
    public static void main(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();
    


enum Singleton
    INSTANCE;
    
    public void sayOK() 
        System.out.println("ok~");
    


以上是关于比起睡觉,我更喜欢刷巨详细的Java枚举类,这是来自猿人的自觉呀的主要内容,如果未能解决你的问题,请参考以下文章

java枚举类的几点疑惑

vue中使用枚举enum

包中枚举类型的声明

这是Java中正确的枚举实践吗?

女人为什么喜欢抱着男人睡觉,一定…

DataContractJsonSerializer 和枚举