java 枚举(enum) 全面解读

  • 时间:
  • 浏览:0
  • 来源:5分11选5APP下载_5分11选5APP官方

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

原困着太少开发者把它当成了教条,禁止在Android上使用枚举.

曾经太少我不能知道枚举简单的使用最好的办法 ,只能看出枚举的特点和枚举的具体实现.

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

如当许多人只能实现加减运算,就都不能在枚举类型中声明曾经 apply抽象最好的办法 ,在特定于常量的最好的办法 (Constant-specific class body的Constant -specific method implementation)中,用具体实现抽象最好的办法 .

之后,枚举常量涵盖类型安全检查的功能,使用常规的实现,都没有你你你这个功能.

这里当许多人都不能使用android提供的注解来实现类型检查. @StringDef@IntDef

具体都不能参考这篇文章. Android Performance: Avoid using ENUM on Android

getDeclaringClass(): 最好的办法 返回枚举声明的Class对象

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

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

它都不能在 switch语录中使用

枚举类天生有有有哪些行态.之后实现单例相当简单.

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

equals(): 从我觉得现来看, 当许多人进程运行中使用 == 不可能 equals来判断曾经枚举相等都有一样的.

ordinal: 表示枚举的顺序,从Color类中都不能看出,它是从0始于英文按自然数顺序增长,且其值是final类型,外部无法更改.对于 ordinal()最好的办法 ,官方建议尽量四种 使用它,它主太少我提供给EnumMap,EnumSet使用的.

Color类中都不能看出, Color对象是在静态域创建,由类加载时初始化,JVM保证进程运行安全,曾经就能确保Color对象不不不可能 并发一块儿请求而错误的创建多个实例.

EnumSet,EnumMap四种 常用,这里不做太少解释,想了解的都不能参考 深入理解Java枚举类型(enum)

Enum成员变量和最好的办法

如上诉 Color枚举类,太少我典型的枚举常量.

枚举类型使用的最常用类型太少我枚举常量.下面通过曾经简单的Demo来说明枚举的原理.

枚举是Java1.5引入的新行态,通过关键字enum来定义枚举类。枚举类是四种 特殊类,它和普通类一样都不能使用构造器、定义成员变量和最好的办法 ,不能实现曾经或多个接口,但枚举类只能继承一点类.

单例模式网上有6-7中写法,除了 枚举最好的办法 外, 都有曾经致命的缺点, 只能完整保证单例在jvm中保持唯一性.

处里方案 : 使用readResolve()最好的办法 来处里此事趋于稳定.

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

从反编译的Color类中都不能看出,在enum关键字的类中,第一行 (准确的说是第曾经分号前) 定义的变量,回会生成曾经 Color实例,且它是在静态域中进行初始化的, 而静态域在类加载阶段的cinit中进行初始化,太少枚举对象是进程运行安全的,由JVM来保证.

我我觉得四种 都没有,当数据和行为有关联时,不可能 说数据受到行为的控制时,都不能考虑使用策略枚举.

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

除了枚举常量外, enum是曾经完整的类,它也都不能编写买车人的构造最好的办法 以及最好的办法 ,甚至实现接口.

当许多人知道一旦实现了Serializable接口之后,反序列化时每次调用 readObject()最好的办法 返回的都有曾经新创建出来的对象.

之后,枚举类的装载和初始化回会有时间和空间的成本. 它的实现比一点最好的办法 只能更多的内存空间,太少在Android你你你这个受资源约束的设备中尽量处里使用枚举单例,而选折 双重检查锁(DCL)静态外部类的最好的办法 实现单例.

处里方案 : 在构造上述中判断,当多于曾经实例时,再调用构造函数,直接报错.

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

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

生成的枚举类有 Color $VALUES[];成员变量,外部都不能通过values()最好的办法 获取当前枚举类的所有实例对象.

这句话的意思是枚举类型它拥有的实例在编写的之后,就不可能 选折 下,只能通过一点手段进行创建,且枚举变量在jvm有且只能曾经对应的实例.

有都没有语录 :

太少,枚举实现的单例,都不能说是最完美和简洁的单例了.推荐当许多人使用你你你这个最好的办法 创建单例.

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

枚举类型是类型安全的,都不能对传入的值进行类型检查:

之后,一定只能使用枚举吗?

这四种 缺点我觉得都有最好的办法 处里,之后不免一点繁琐.

从反编译的Color类中都不能发现, 枚举为每曾经对象创建曾经枚举对象,枚举对象后面 合适 有 曾经String类型(name),和曾经int类型(ordinal)加在在对象头部占用的内存.(此处还忽略了$VALUS数组的创建消耗).

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

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

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

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

name: 表示枚举类的名字,从Color类的构造函数都不能看出,它的值太少我当许多人定义的实例的名称.

当许多人在例子中四种 能打印出实例名称,是不可能 它的toString()最好的办法 直接返回了name属性.

从反编译的类中,都不能看出, 当许多人使用enum关键字编写的类,在编译阶段编译器会自动帮当许多人生成一份真正在jvm中运行的代码.

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

枚举类都不能编写买车人的构造函数,之后只能声明public,protected,为了是不不外部创建实例对象,默认为private且只能为它.