java 枚举(enum) 全面解读

  • 时间:
  • 浏览:1

.我.我.我知道一旦实现了Serializable接口后后,反序列化时每次调用 readObject()土最好的法律法律依据返回的也有1个新创建出来的对象.

枚举类型使用的最常用类型只是枚举常量.下面通过1个简单的Demo来说明枚举的原理.

除了枚举常量外, enum是1个删剪的类,它也可以 编写自己的构造土最好的法律法律依据以及土最好的法律法律依据,甚至实现接口.

枚举类天生有哪几种内部结构.就让实现单例相当简单.

出理 方案 : 在构造上述中判断,当多于1个实例时,再调用构造函数,直接报错.

枚举类型,在 JVM 层面禁止了通过反射构造枚举实例的行为,机会尝试通过反射创建,机会报Cannot reflectively create enum objects.

它可以 在 switch语录中使用

一点,枚举实现的单例,可以 说是最完美和简洁的单例了.推荐.我.我.我使用你这个土最好的法律法律依据创建单例.

就让,枚举常量所含类型安全检查的功能,使用常规的实现,没有你这个功能.

这里.我.我.我可以 使用android提供的注解来实现类型检查. @StringDef@IntDef

具体可以 参考这篇文章. Android Performance: Avoid using ENUM on Android

有没有语录 :

这句话的意思是枚举类型它拥有的实例在编写的后后,就机会确定下,可以通过一点手段进行创建,且枚举变量在jvm有且可以1个对应的实例.

name: 表示枚举类的名字,从Color类的构造函数可以 看出,它的值只是.我.我.我定义的实例的名称.

.我.我.我在例子中之一点能打印出实例名称,是机会 它的toString()土最好的法律法律依据直接返回了name属性.

生成的枚举类有 Color $VALUES[];成员变量,内部内部结构可以 通过values()土最好的法律法律依据获取当前枚举类的所有实例对象.

这可以能 注意,枚举类可以继承一点类,机会在编译时它机会继承了 Enum,java无法多继承

枚举是Java1.5引入的新内部结构,通过关键字enum来定义枚举类。枚举类是你这个特殊类,它和普通类一样可以 使用构造器、定义成员变量和土最好的法律法律依据,可以实现1个或多个接口,但枚举类可以继承一点类.

Color类中可以 看出, Color对象是在静态域创建,由类加载时初始化,JVM保证应用tcp连接安全,原来就能确保Color对象太大再机会并发一同请求而错误的创建多个实例.

我实在何必 没有,当数据和行为有关联时,机会说数据受到行为的控制时,可以 考虑使用策略枚举.

特定的常量类型与主体中的土最好的法律法律依据或行为有关时,即当数据与行为之间有关联时,可以 考虑使用枚举来实现策略模式.

如有个 handleColor(Color color)土最好的法律法律依据,没有土最好的法律法律依据参数自动会对类型进行检查,可以传入 Color.WHITEColor.BLACK,机会使用 static final定义的常量则不具备 类型安全的特点.

而枚举则不同,在序列化的后后Java仅仅是将枚举对象的name属性输出到结果中,反序列化的后后则是通过Enum的valueOf()土最好的法律法律依据来根据名字查找枚举对象。一同,编译器是不允许任何对你这个序列化进行定制,就让禁用了writeObjectreadObjectreadObjectNoDatawriteReplacereadResolve等土最好的法律法律依据。

EnumSet,EnumMap何必 常用,这里不做太大解释,想了解的可以 参考 深入理解Java枚举类型(enum)

如上诉 Color枚举类,只是典型的枚举常量.

出理 方案 : 使用readResolve()土最好的法律法律依据来出理 此事地处.

Enum类实现了 Comparable接口,表明它是支持排序的,可以 通过 Collections.sort 进行自动排序.实现了public final int compareTo(E o)接口,土最好的法律法律依据定义为final且实在现依赖的ordinal字段也是final类型,说明他可以根据ordinal排序,排序规则不可变.

这你这个缺点实在也有土最好的法律法律依据出理 ,就让不免一点繁琐.

单例模式网上有6-7中写法,除了 枚举土最好的法律法律依据外, 也有1个致命的缺点, 可以删剪保证单例在jvm中保持唯一性.

从反编译的类中,可以 看出, .我.我.我使用enum关键字编写的类,在编译阶段编译器会自动帮.我.我.我生成一份真正在jvm中运行的代码.

ordinal: 表示枚举的顺序,从Color类中可以 看出,它是从0后后后后刚开始 英文按自然数顺序增长,且其值是final类型,内部内部结构无法更改.对于 ordinal()土最好的法律法律依据,官方建议尽量何必 使用它,它主只是提供给EnumMap,EnumSet使用的.

就让,一定可以使用枚举吗?

equals(): 从实在现来看, .我.我.我应用tcp连接中使用 == 机会 equals来判断1个枚举相等也有一样的.

使用枚举常量比使用final static来实现常量定义,枚举的内存消耗比后高不止两倍. 你应该严格出理 在Android上使用枚举.

从反编译的Color类中可以 看出,在enum关键字的类中,第一行 (准确的说是第1个分号前) 定义的变量,回会 生成1个 Color实例,且它是在静态域中进行初始化的, 而静态域在类加载阶段的cinit中进行初始化,一点枚举对象是应用tcp连接安全的,由JVM来保证.

原来只是都可以知道枚举简单的使用土最好的法律法律依据,可以看出枚举的特点和枚举的具体实现.

下面.我.我.我通过 jad工具来反编译Color类, 通过jad -sjava Color.class反编译出一份java文件.

Enum类接受1个继承自Enum的泛型.(在反编译java文件中没有体现泛型是机会,泛型在阶段就会被类型类型擦除,替换为具体的实现.).

该类继承自 Enum类,public abstract class Enum<E extends Enum<E>>implements Comparable<E>, Serializable.

为了达到你这个效果,它通过以下土最好的法律法律依据来确保.

就让,不建议在Android中使用枚举常量,而更偏向于使用 static final来定义常量.

就让,枚举类的装载和初始化回会 有时间和空间的成本. 它的实现比一点土最好的法律法律依据可以 更多的内存空间,一点在Android你这个受资源约束的设备中尽量出理 使用枚举单例,而确定 双重检查锁(DCL)静态内部内部结构类的土最好的法律法律依据实现单例.

Enum成员变量和土最好的法律法律依据

Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.

是因为一点开发者把它当成了教条,禁止在Android上使用枚举.

在旧版的Android开发者官网的指南 Managing Your App's Memory,新版中机会被移除.

从反编译的Color类中可以 发现, 枚举为每1个对象创建1个枚举对象,枚举对象里边要花费有 1个String类型(name),和1个int类型(ordinal)加进去去进去对象头部占用的内存.(此处还忽略了$VALUS数组的创建消耗).

单个枚举类型常量,比static final声明的常量占用的内存大的多.

枚举类可以 编写自己的构造函数,就让可以声明public,protected,为了是太大再内部内部结构创建实例对象,默认为private且可以为它.

getDeclaringClass(): 土最好的法律法律依据返回枚举声明的Class对象

如.我.我.我可以 实现加减运算,就可以 在枚举类型中声明1个 apply抽象土最好的法律法律依据,在特定于常量的土最好的法律法律依据(Constant-specific class body的Constant -specific method implementation)中,用具体实现抽象土最好的法律法律依据.

枚举类型是类型安全的,可以 对传入的值进行类型检查: