enum类

ENUM类详解

在单例模式的时候,有一种写法就是利用enum类的特性:每个实例只会被JVM加载一次;
但是由于之前对enum类了解的并不多,尤其是定义实例的方式不同,为什么一个字段就是enum的实例?为什么每个实例只会被加载一次?
其实要了解enum类最简单的方法就是反编译看源码!
话不多说,上代码~

这是一个简单的enum类:

public enum TestEnum {
    YELLOW,RED,BLUE,BLACK
}

反编译这个类,用Jdk自带的工具:javap -verbose TestEnum.class(class文件的路径,在TestEnum.class同一路径打开命令行窗口直接这样写就可以,不在同一路径记得补全路径)

public final class design.TestEnum extends java.lang.Enum<design.TestEnum>
......//此处省略掉一些看不懂的代码,对理解enum影响不大,有兴趣的同学可以自己反编译看下
......
{
  public static final design.TestEnum YELLOW;
    descriptor: Ldesign/TestEnum;
    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM

  public static final design.TestEnum RED;
    descriptor: Ldesign/TestEnum;
    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM

  public static final design.TestEnum BLUE;
    descriptor: Ldesign/TestEnum;
    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM

  public static final design.TestEnum BLACK;
    descriptor: Ldesign/TestEnum;
    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
    //此处省略掉一些看不懂的代码,对理解enum影响不大,有兴趣的同学可以自己反编译看下
...
....
..
Ljava/lang/Enum<Ldesign/TestEnum;>;
SourceFile: "TestEnum.java"

看到这些代码,之前我们的疑惑瞬间解开;为什么YELLOW是enum的实例?为什么enum类的实例只会被加载一次??看代码一目了然:

YELLOW,RED,BLUE,BLACK
public static final design.TestEnum YELLOW;
public static final design.TestEnum RED;
public static final design.TestEnum BLUE;
public static final design.TestEnum BLACK;

问题解决!

我们再来深入的了解一下,这个enum类;
首先看看:

public final class design.TestEnum extends java.lang.Enum<design.TestEnum>

有一个小特性:被final修饰,说明enum类不能被继承;

既然enum类本质也是一个class那我们能不能创建构造方法呢?能不能创建字段?能不能创建方法??
答案是肯定滴!

enum类中

  • 可以创建构造方法
  • 可以定义字段
  • 可以创建方法
    不过要注意一点:构造方法只能用private修饰或者不用修饰符
    YELLOW(12,"yellow11"),
    RED(13,"red12"),
    BLUE(14,"blue13"),
    BLACK(15,"black14");
    //自定义变量val,name;
    public   int val;
    public String name;
    //自定义构造方法,前面只能用private修饰,或者不写
     TestEnum(int val,String name){
         this.val = val;
         this.name = name;
    }
    //自定义方法
    public int getVal(){
         return val;
    }



看到上面代码我们知道所有的enum类都是继承了Enum;
再看下Enum源码:其中有2个属性

 /**
     * The name of this enum constant, as declared in the enum declaration.
     * Most programmers should use the {@link #toString} method rather than
     * accessing this field.
     */
private final String name;
//获取name属性
public final String name() {
        return name;
    }
    /**
     * The ordinal of this enumeration constant (its position
     * in the enum declaration, where the initial constant is assigned
     * an ordinal of zero).
     *
     * Most programmers will have no use for this field.  It is designed
     * for use by sophisticated enum-based data structures, such as
     * {@link java.util.EnumSet} and {@link java.util.EnumMap}.
     */

private final int ordinal;
//获取ordinal属性
public final int ordinal() { return ordinal;}   

name,就是实例的名称 ,比如实例YELLOW,他的name就是:String型的:YELLOW;

ordinal,是实例的下标,从0开始跟数组一样;比如上面4个实例
:YELLOW,RED,BLUE,BLACK;他们的下表分别是:0,1,2,3;是按照他们的先后顺序来确定的;

看到这,大概对enum就有一个比较清楚的认识了;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,enum是一种特殊的,用于定义一组常量。通过使用enum关键字,我们可以在一个enum中添加多个枚举。 enum是一种高级数据型,它可以包含固定数量的元素,这些元素代表一组相关的常量。每个枚举元素都是enum的一个实例,并且具有唯一的名称。 为了添加枚举,我们可以在enum的声明中使用逗号将枚举元素分隔开来。每个枚举元素就像是一个常量,可以给它们一个名称。下面是一个示例: ``` enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } ``` 在这个例子中,我们创建了一个名为Day的enum,并添加了七个枚举元素,分别代表一周中的每一天。 我们可以通过使用枚举的名称和枚举元素的名称来引用它们。例如,使用Day.MONDAY可以引用MONDAY枚举元素。 通过为每个元素分配不同的值,我们可以在enum中添加更多的信息。例如,我们可以为每个枚举元素指定一个字符串值,以便表示不同的周几。下面是一个带有字符串值的示例: ``` enum Day { MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"), THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星期六"), SUNDAY("星期日"); private String chineseName; private Day(String name) { chineseName = name; } public String getChineseName() { return chineseName; } } ``` 在这个示例中,我们通过一个私有的构造函数为每个枚举元素指定了一个中文名称,并提供了一个用于获取中文名称的公共方法getChineseName()。 总结来说,通过在enum的声明中使用逗号分隔的枚举元素,我们可以添加枚举。枚举元素可以通过名称引用,还可以为每个元素添加一些信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值