Java枚举

简介:

Java枚举有如下特点:

  • 枚举类省略了private类型的构造函数,且构造函数只能为私有;
  • 枚举的域(field)实质就是相应的枚举类的一个实例对象;
  • 当访问枚举的实例(域)时才会执行构造方法实例化,例如下面的DAY实例只有被访问时才会被创建;
  • 枚举的实例(域)都被static final修饰,保证了只能被实例化一次;
  • 编译器会自动为枚举继承java.lang.Enum的类,所以代码中枚举只能实现接口而不能再继承其他类;

枚举原理

下面看一个简单的枚举类:

package com.faith.net;

/**
 * 日期类型
 */
public enum DateType {

    DAY;
}

上面的代码在编译后实际等同于:

public class DateType extends Enum {

    public static final DateType DAY;
    
    private DateType () {}
}

可以把DateType看做一个类,而Day是DateType的一个实例。它的构造方法则是私有的。

枚举添加静态变量/方法和成员变量/方法

枚举中也可以添加静态变量、静态方法和成员变量、成员方法:

public enum DateType {

    DAY;
    
    static int value;
    public static int getValue() {
        return value;
    }

    String name;
    public String getName() {
        return name;
    }
}

我们把DateType看做一个类,静态变量和静态方法和普通类调用方式一样:

DateType.value
DateType.getValue()

成员变量和成员方法是每个类的实例才能调用的方法。而枚举类的实例就是它的域。所以调用枚举的成员变量和方法,通过如下方式:

DateType.DAY.name
DateType.DAY.getName()

重写枚举成员方法

枚举的每个实例(域)还可以重写枚举中的成员方法,类似于多态,如下:

public enum DateType {

    DAY {
        public Integer getValue() {
            return 0;
        }
    };
    
    static Integer value = 1;
    public static Integer getValue() {
        return value;
    }

    String name;
    public String getName() {
        return name;
    }
}

DAY中重写了getValue方法,重写前DateType.DAY.getValue()值为1,重写后则调用DAY中自己定制的getValue方法,结果为0。

枚举添加抽象方法

还可以在枚举中添加抽象方法,强制所有实例(域)都实现各自的处理逻辑:

public enum DateType {

    DAY {
        @Override
        public String getText() {
            return null;
        }
    },

    WEEK {
        @Override
        public String getText() {
            return null;
        }
    };

    public abstract String getText(); // 抽象方法,强制所有实例实现
}

枚举实现接口

强制实例必须实现方法还可以通过实现接口:

public interface NameEnum {
    String getName();
}
public enum DateType implements NameEnum {

    DAY {
        @Override
        public String getName() {
            return null;
        }
    },

    Week {
        @Override
        public String getName() {
            return null;
        }
    };
}

带参构造

枚举使用带参构造函数:

package com.faith.net;

import java.util.HashMap;
import java.util.Map;

/**
 * 日期类型
 *
 * @author hugende
 */
public enum DateType {

    DAY("sdfsdf", 0) {
        @Override
        public String getText() {
            return null;
        }
    },

    WEEK("sdf", 1) {
        @Override
        public String getText() {
            return null;
        }
    };

    public abstract String getText();

    String name;
    Integer age;
    
    DateType(String name, Integer age) {
        this.name = "s";
        this.age = age;
    }
}

访问方式如下:

DateType.DAY.name  // 0
DateType.WEEK.name // 1

遍历枚举

枚举提供了values方法:

public class EnumTest {

    public static void main(String[] args) {
        DateType[] values = DateType.values();
        for (DateType dateType : values) {
            System.out.println(dateType.age);
        }
    }
}

枚举的父类

Java强制枚举实现了Enum类,这个类的声明如下:

public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable

可见其实现了Comparable、Serializable,支持了比较与序列化传输。

目录
相关文章
|
23天前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
103 60
|
2月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
65 9
Java——反射&枚举
|
2月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
81 5
|
2月前
|
安全 Java 开发者
Java 枚举(enum)详解
Java 中的枚举(`enum`)是一种特殊的数据类型,用于定义一组固定的常量,提升代码的类型安全性和可读性。枚举使用 `enum` 关键字定义,支持方法和构造函数,具有类型安全、单例、自动序列化等特点,并且可以遍历和用于 `switch` 语句中。实际应用包括状态机、指令集、类型标识等场景。枚举使代码更加清晰易维护。
|
6月前
|
安全 Java 程序员
Java语言枚举(Enum)的深入探索
Java语言枚举(Enum)的深入探索
|
3月前
|
Java
Java枚举使用的基本案例
这篇文章是关于Java枚举的基本使用,通过一个指令下发的代码案例,展示了如何定义枚举、使用枚举以及如何通过枚举实现指令的匹配和处理。
|
3月前
|
Java 开发者
在Java编程中,if-else与switch作为核心的条件控制语句,各有千秋。if-else基于条件分支,适用于复杂逻辑;而switch则擅长处理枚举或固定选项列表,提供简洁高效的解决方案
在Java编程中,if-else与switch作为核心的条件控制语句,各有千秋。if-else基于条件分支,适用于复杂逻辑;而switch则擅长处理枚举或固定选项列表,提供简洁高效的解决方案。本文通过技术综述及示例代码,剖析两者在性能上的差异。if-else具有短路特性,但条件增多时JVM会优化提升性能;switch则利用跳转表机制,在处理大量固定选项时表现出色。通过实验对比可见,switch在重复case值处理上通常更快。尽管如此,选择时还需兼顾代码的可读性和维护性。理解这些细节有助于开发者编写出既高效又优雅的Java代码。
57 2
|
3月前
|
安全 Java 编译器
|
4月前
|
存储 缓存 Java
java枚举消除冗余代码问题之findByName和findByValue方法工作时的问题如何解决
java枚举消除冗余代码问题之findByName和findByValue方法工作时的问题如何解决
|
4月前
|
安全 Java
Java进阶之枚举
【7月更文挑战第11天】Java枚举是Java 5引入的特性,用于定义固定常量集合,如星期。枚举是继承自`java.lang.Enum`的特殊类,编译后成为final类,每个枚举值是静态final实例。定义枚举用`enum`关键字,如`public enum Weekday {MONDAY, TUESDAY, ...}`。枚举可包含方法和变量,能实现接口但不能继承其他类。例如,`Weekday`枚举可实现`Describe`接口,提供`describe()`方法。在实际应用中,枚举常用于表示如响应状态等固定选项,便于类型安全和代码阅读。
39 8