Java Enum类用法详解

一、什么是Java Enum类

Java Enum类是从Java 5开始引入的类型,它是一种特殊类型的类,它可以用来定义一组常量,这些常量通常表示一些有限的可能性。Enum类可以被看作是一组有限常量的组合,同时它也可以具有属性和方法,这些属性和方法是与枚举的常量相关联的。

Enum类是final类,所以它不能被继承。同时Enum类的构造方法是私有的,因此枚举常量的实例化不能在程序中自行完成,而是由编译器完成实例化。

二、Java Enum类的优缺点

Enum类具有以下优点:

1、易读性好:枚举类型常量名称是有意义的,而且可以据此获知它是整个类型中的哪一个。

2、类型安全:由于枚举值是在编译器进行检查的,所以不存在误解,也可以防止在传递参数时传递非法的枚举值。

3、可读性好:我们可以使用枚举类型的toString()方法获取具有可读性的名称。

4、可以使用switch语句:我们可以使用switch语句轻松处理枚举类型。

Enum类具有以下缺点:

1、不能继承:对于一些含有许多共同特征的常量,可能会导致代码重复,但是由于Enum类不能被继承,所以不得不重复定义。

2、不能在运行时动态获得枚举值:由于枚举值是在编译器进行检查的,所以不能通过简单的字符串转换获得枚举值,如果需要这样做,需要手动编写代码进行转换。

三、Java Enum类的定义和使用

1、定义枚举类型

public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER;
}

在定义枚举类型时,除了类名和枚举常量之外,不需要添加其他元素。

上面的例子中定义了一个代表四季的枚举类型Season,其中SPRING、SUMMER、AUTUMN和WINTER是四个枚举常量,它们分别代表春、夏、秋、冬。

2、使用枚举类型

Season season = Season.SUMMER;

我们可以通过枚举类型名称和枚举常量名称来获得枚举类型的实例,这里的变量season就是Season类型的实例化对象。

3、枚举类型的属性和方法

除了可以使用枚举类型的名称和枚举常量名称来获得枚举类型的实例之外,我们还可以使用枚举类型的属性和方法来获取相关信息。

3.1、获取枚举类型的属性
public enum Season {
    SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天");
    
    private String name;
    
    Season(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
}

在上面的代码中,我们为每个枚举常量增加了一个name属性,并在构造方法中为其赋值,同时增加了一个getName()方法,用来获得该属性的值。

Season season = Season.SUMMER;
System.out.println(season.getName());

在使用时,我们可以通过调用枚举类型的属性来获取相关信息,如上面的例子中,我们使用了getName()方法来获得枚举常量的名字。

3.2、枚举类型的方法
public enum Season {
    SPRING("春天", 1), SUMMER("夏天", 2), AUTUMN("秋天", 3), WINTER("冬天", 4);
    
    private String name;
    private int index;
    
    Season(String name, int index) {
        this.name = name;
        this.index = index;
    }
    
    public String getName() {
        return name;
    }
    
    public int getIndex() {
        return index;
    }
    
    public static Season getSeasonById(int index) {
        Season[] seasons = Season.values();
        for(Season season : seasons) {
            if(season.getIndex() == index) {
                return season;
            }
        }
        return null;
    }
}

在上面的代码中,我们增加了一个index属性,并在构造方法中为其赋值,同时增加了一个getIndex()方法来获得该属性的值。另外,我们还增加了一个静态方法getSeasonById(),用来根据index获得对应的Season类型。

Season season = Season.getSeasonById(2);
System.out.println(season.getName());

在使用时,我们可以通过调用枚举类型的方法来获取相关信息,如上面的例子中,我们使用了getSeasonById()方法来根据指定index获得对应的枚举类型。

四、Java Enum类的高级用法

1、枚举类型的实现接口

public interface Action {
    void doSomething();
}

public enum Season implements Action {
    SPRING("春天", 1) {
        @Override
        public void doSomething() {
            System.out.println("春天来了,万物复苏");
        }
    }, 
    SUMMER("夏天", 2) {
        @Override
        public void doSomething() {
            System.out.println("夏天来了,热情奔放");
        }
    }, 
    AUTUMN("秋天", 3) {
        @Override
        public void doSomething() {
            System.out.println("秋天来了,金风玉露");
        }
    }, 
    WINTER("冬天", 4) {
        @Override
        public void doSomething() {
            System.out.println("冬天来了,白雪皑皑");
        }
    };
    
    private String name;
    private int index;
    
    Season(String name, int index) {
        this.name = name;
        this.index = index;
    }
    
    public String getName() {
        return name;
    }
    
    public int getIndex() {
        return index;
    }
    
    public static Season getSeasonById(int index) {
        Season[] seasons = Season.values();
        for(Season season : seasons) {
            if(season.getIndex() == index) {
                return season;
            }
        }
        return null;
    }
}

在上面的代码中,我们定义了一个Action接口,并同时实现了Season枚举类型。在每个枚举常量中,我们都覆盖了doSomething()方法,用来展示不同季节的特征。

Season season = Season.SUMMER;
season.doSomething();

在使用时,我们可以直接调用该枚举类型实现的接口方法,例如上面的例子中,我们通过调用doSomething()方法来展示对应枚举类型的特征。

2、使用枚举常量的构造方法

public enum Season {
    SPRING("春天", 1), SUMMER("夏天", 2), AUTUMN("秋天", 3), WINTER("冬天", 4);
    
    private String name;
    private int index;
    
    Season(String name, int index) {
        this.name = name;
        this.index = index;
    }
    
    public String getName() {
        return name;
    }
    
    public int getIndex() {
        return index;
    }
    
    public static Season getSeasonById(int index) {
        Season[] seasons = Season.values();
        for(Season season : seasons) {
            if(season.getIndex() == index) {
                return season;
            }
        }
        return null;
    }
}

在上面的代码中,我们在Season枚举类型的构造方法中使用了两个参数name和index来初始化枚举常量。通过这种方式,我们可以在枚举类型中自定义构造方法,来满足特定的需求。

Season season = new Season("春天", 1);
System.out.println(season.getName());

但是需要注意的是,这里对象season实际上是通过编译器生成一个新的Season对象来实例化的,它不是枚举类型中的常量,而是普通的对象,因此也就无法使用枚举类型定义的方法。

3、使用枚举常量的实例域

public enum Season {
    SPRING("春天", "一"), SUMMER("夏天", "二"), AUTUMN("秋天", "三"), WINTER("冬天", "四");
    
    private String name;
    private String code;
    
    Season(String name, String code) {
        this.name = name;
        this.code = code;
    }
    
    public String getName() {
        return name;
    }
    
    public String getCode() {
        return code;
    }
}

在上面的代码中,我们在Season枚举类型中增加了一个code实例域,用来存储各个季节的代码。通过这种方式,我们可以在枚举类型中保存更多的信息。

4、使用枚举常量的抽象方法

public enum Season {
    SPRING("春天", 1) {
        @Override
        public String getDesc() {
            return "万物复苏";
        }
    }, 
    SUMMER("夏天", 2) {
        @Override
        public String getDesc() {
            return "热情奔放";
        }
    }, 
    AUTUMN("秋天", 3) {
        @Override
        public String getDesc() {
            return "金风玉露";
        }
    }, 
    WINTER("冬天", 4) {
        @Override
        public String getDesc() {
            return "白雪皑皑";
        }
    };
    
    private String name;
    private int index;
    
    Season(String name, int index) {
        this.name = name;
        this.index = index;
    }
    
    public String getName() {
        return name;
    }
    
    public int getIndex() {
        return index;
    }
    
    public abstract String getDesc();
}

在上面的代码中,我们在Season枚举类型中增加了一个抽象方法getDesc(),该方法在每个枚举常量中都需要被具体实现。通过这种方式,我们可以在枚举类型中定义更多的行为,并实现多态性的效果。

Season season = Season.SUMMER;
System.out.println(season.getDesc());

在使用时,我们可以通过调用枚举类型的抽象方法来获取不同季节的特点,如上面的例子,在调用getDesc()方法时会根据具体的Season枚举常量实现方法的不同而返回不同的结果。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/160481.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-21 01:13
下一篇 2024-11-21 01:13

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • Java 8 Group By 会影响排序吗?

    是的,Java 8中的Group By会对排序产生影响。本文将从多个方面探讨Group By对排序的影响。 一、Group By的概述 Group By是SQL中的一种常见操作,它…

    编程 2025-04-29

发表回复

登录后才能评论