Java枚举



为什么是单例?

下面还是要简述一下,我们先写个枚举类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public enum BusinessStatus {

SUCCESS(200),

FAIL(500);

private Integer code;

BusinessStatus(Integer code) {
this.code = code;
}

public Integer getCode() {
return code;
}

}

先运行指令: javac BusinessStatus.java 生成对应的class文件, 之后再进行javap命令查看

1
javap BusinessStatus.class

输出如下:

1
2
3
4
5
6
7
8
public final class BusinessStatus extends java.lang.Enum<BusinessStatus> {
public static final BusinessStatus SUCCESS;
public static final BusinessStatus FAIL;
public static BusinessStatus[] values();
public static BusinessStatus valueOf(java.lang.String);
public java.lang.Integer getCode();
static {};
}

其实到这里我们已经大致知道枚举的本质了,实际上我们编写的枚举类BusinessStatus是继承自Enum的,每个枚举对象都是static final的类对象

当然我们还可以使用 javap -c BusinessStatus.class查看字节码文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public final class BusinessStatus extends java.lang.Enum<BusinessStatus> {
public static final cn.coderblue.studyaop.enums.BusinessStatus SUCCESS;

public static final cn.coderblue.studyaop.enums.BusinessStatus FAIL;

public static cn.coderblue.studyaop.enums.BusinessStatus[] values();
Code:
0: getstatic #1 // Field $VALUES:[Lcn/coderblue/studyaop/enums/BusinessStatus;
3: invokevirtual #2 // Method "[Lcn/coderblue/studyaop/enums/BusinessStatus;".clone:()Ljava/lang/Object;
6: checkcast #3 // class "[Lcn/coderblue/studyaop/enums/BusinessStatus;"
9: areturn

...
}

枚举能不能动态代理?

枚举的关键字是enum而不是class,那么这是不是意味着它不是一个类呢?

其实枚举底层就是继承了Enum这个类,我们定义的枚举中的属性其实都是static的静态成员。由于枚举类加了final修饰词,说到这里,我们知道枚举肯定是不能用cglib的动态代理了,因为cglib通过extends继承实现,然而枚举并没有办法被继承,因此此方法行不通。那么jdk的动态代理可以吗?可以。

参考CSDA博主 - 最菜Java开发实习生)

枚举类型用==还是equals

最近比较困惑,虽然我也懂得 == 和 equals() 之间的区别,但哪一个操作符才是我该使用的呢?

二者皆对,如果你看过枚举的源码,你会发现在源码中,equals也仅仅非常简单的 == 。 我使用 == ,因为无论如何,这个左值是可以为 null的

不过二者有什么不一样呢?

== 不会抛出 NullPointerException

1
2
3
4
5
6
7
public static void main(String[] args) {

Color nothing = null;
if (nothing == Color.BLACK); // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerException
}
enum Color { BLACK, WHITE };

== 在编译期检测类型兼容性

1
2
3
4
5
enum Color { BLACK, WHITE };
enum Chiral { LEFT, RIGHT };

if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine
if (Color.BLACK == Chiral.LEFT); // DOESN'T COMPILE!!! Incompatible types!

在枚举比较上使用 == , 因为: 1. 能正常工作 2. 更快 3. 运行时是安全的 4. 编译期也是安全的

参考链接:Comparing Java enum members: == or equals()?

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  1. © 2020-2021 Lauy    湘ICP备20003709号

请我喝杯咖啡吧~

支付宝
微信