首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java 枚举(enum) 全面解读

从反编译的Color类中可以看出,在enum关键字的类中,第一行 (准确的说是第一个分号前) 定义的变量,都会生成一个 Color实例,且它是在静态域中进行初始化的, 而静态域在类加载阶段的cinit中进行初始化...类加载时创建,保证线程安全 从Color类中可以看出, Color对象是在静态域创建,由类加载时初始化,JVM保证线程安全,这样就能确保Color对象不会因为并发同时请求而错误的创建多个实例....它的实现比其他方式需要更多的内存空间,所以在Android这种受资源约束的设备中尽量避免使用枚举单例,而选择 双重检查锁(DCL)和静态内部类的方式实现单例....你应该严格避免在Android上使用枚举. 导致很多开发者把它当成了教条,禁止在Android上使用枚举....因此,不建议在Android中使用枚举常量,而更偏向于使用 static final来定义常量. 但是,枚举常量中有类型安全检查的功能,使用常规的实现,没有这种功能.

96710

关于Java中枚举Enum的深入剖析

Enum 在Enum之前的我们使用类似如下的代码实现枚举的功能. public static final int COLOR_RED = 0; public static final int COLOR_GREEN...Enum转成了int值(通过调用Enum.oridinal()方法) 枚举与混淆 在Android开发中,进行混淆是我们在发布前必不可少的工作,混下后,我们能增强反编译的难度,在一定程度上保护了增强了安全性...values()方法和valueOf()方法,请参考文章读懂 Android 中的代码混淆 关于枚举的部分 使用proguard优化 使用Proguard进行优化,可以将枚举尽可能的转换成int。...(Android中)该不该用枚举 既然上面提到了枚举会转换成类,这样理论上造成了下面的问题 增加了dex包的大小,理论上dex包越大,加载速度越慢 同时使用枚举,运行时的内存占用也会相对变大 关于上面两点的验证...关于枚举是否使用的结论,大家可以参考 如果你开发的是Framework不建议使用enum 如果是简单的enum,可以使用int很轻松代替,则不建议使用enum 另外,如果是Android中,可以使用下面介绍的枚举注解来实现

71230
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    关于Java中枚举Enum的深入剖析

    Enum 在Enum之前的我们使用类似如下的代码实现枚举的功能. public static final int COLOR_RED = 0;public static final int COLOR_GREEN...Enum转成了int值(通过调用Enum.oridinal()方法) 枚举与混淆 在Android开发中,进行混淆是我们在发布前必不可少的工作,混下后,我们能增强反编译的难度,在一定程度上保护了增强了安全性...values()方法和valueOf()方法,请参考文章读懂 Android 中的代码混淆 关于枚举的部分 使用proguard优化 使用Proguard进行优化,可以将枚举尽可能的转换成int。...(Android中)该不该用枚举 既然上面提到了枚举会转换成类,这样理论上造成了下面的问题 增加了dex包的大小,理论上dex包越大,加载速度越慢 同时使用枚举,运行时的内存占用也会相对变大 关于上面两点的验证...关于枚举是否使用的结论,大家可以参考 如果你开发的是Framework不建议使用enum 如果是简单的enum,可以使用int很轻松代替,则不建议使用enum 另外,如果是Android中,可以使用下面介绍的枚举注解来实现

    95630

    单例模式的六种写法

    ,线程安全(因为虚拟机保证只会装载一次,在装载类的时候是不会发生并发的) 缺点:耗内存(若类中有静态方法,在调用静态方法的时候类就会被加载,类加载的时候就完成了单例的初始化,拖慢速度) 1public...首先,在枚举中我们明确了构造方法限制为私有,在我们访问枚举实例时会执行构造方法,同时每个枚举实例都是static final类型的,也就表明只能被实例化一次。在调用构造方法时,我们的单例被实例化。...可以看出,会自动生成 ACC_STATIC, ACC_FINAL这两个修饰符 枚举类型为什么是线程安全的?...4.6 使用容器实现单例模式 在程序的初始化,将多个单例类型注入到一个统一管理的类中,使用时通过key来获取对应类型的对象,这种方式使得我们可以管理多种类型的单例,并且在使用时可以通过统一的接口进行操作...) 避免对资源的多重占用(一个写文件操作,只有一个实例存在内存中,避免对同一个资源文件同时写操作) 在系统设置全局访问点,优化和共享资源访问(如:设计一个单例类,负责所有数据表的映射处理) 5.2 单例模式缺点

    3.8K11

    深入分析Java反射(二)-数组和枚举

    本文主要介绍反射中可能用到的两个比较特殊的类型,数组和枚举,分别对应java.lang.reflect.Array和java.lang.Enum,后者其实并不是反射类库包中的类,但是反射的基础类库里面有使用枚举类型的方法...数组是由Java虚拟机实现(这一点很重要,这就是为什么JDK类库中没有数组对应的类型的原因,array也不是Java中的保留关键字,操作数组的底层方法都是native方法),数组类型只有继承自java.lang.Object...2、所有的枚举成员属性都变成static final修饰的在第1步中提到的Java类的实例,属性的名称和原来枚举的名字一致,实例在静态代码块中创建。...3、新增了一个static final修饰的第1步中提到的Java类的数组实例,名称为$VALUES,此数组在静态代码块中创建,基于此数组还新增了一个静态方法values(),此方法就是直接返回数组的克隆...小结 数组和枚举在Java中的使用频率也是比较高的,特别是算法或者框架中,本文尝试从反射角度介绍这两个类型的使用方式,掌握它们对数组或者枚举的使用有很大的帮助。

    61530

    走进 JDK 之 Enum

    什么是枚举 什么是枚举?说实话,在我这些年的开发生涯中,用过枚举的次数大概两只手都可以数的过来。当然你不能说枚举一无是处,只能说是我对 Java 理解的还不够深刻,在可以使用枚举的时候并没有去使用。...字段 private final String name; // 枚举实例的名称,就是枚举声明中的名称 private final int ordinal; // 在枚举声明中的次序,从 0 开始 枚举类就只有这两个字段...ordinal 就是声明中的次序,之所以在 switch 中可以使用枚举,就是因为编译器会自动调用枚举的 ordinal() 方法。...站在 Android 开发者的角度,实际上官方是不建议我们使用枚举的。 枚举占用的空间通常是静态常量的两倍。你应该严格避免在 Android 中使用枚举。 其实我并不是完全赞同。...MVP 多了那么多接口和类,我们应该使用吗?在如今的手机内存下,如果你的应用发生了 OOM,我想枚举应该不是罪魁祸首吧。

    66930

    Java基础重构-面向对象

    从多个具有相同特征的类中抽象出了一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类设计的随意性。...当一个程序中使用接口时,接口时多个模块间的耦合标准。 从某种程度上来看,接口类似于整个系统的 总纲 ,它制定了系统各模块应该遵循的标准,因此一个系统中的接口不应该经常改变。...非静态内部类不能拥有静态成员。 为什么静态内部的实例方法也不能访问外部类的实例属性? 因为静态内部类是外部类的类相关的,而不是外部类的对象相关的。...使用Enum 定义,非抽象的枚举类默认会使用 final 修饰,因此枚举类不能派生子类。...SeasonEnum MALE=new SeasonEnum("男"); public static final SeasonEnum FEmale=new SeasonEnum("女"); 在枚举类中列出枚举值是

    65530

    java | 深入理解Java枚举类型(二)

    在实际应用中,线程池、缓存、日志对象、对话框对象常被设计成单例,总之,选择单例模式就是为了避免不一致状态,下面我们将会简单说明单例模式的几种主要编写方式,从而对比出使用枚举实现单例模式的优点。...我们把Singleton实例放到一个静态内部类中,这样可以避免了静态实例在Singleton类的加载阶段(类加载过程的其中一个阶段的,此时只创建了Class对象,关于Class对象可以看博主另外一篇博文...enum类,为其添加变量和方法,访问方式也更简单,使用SingletonEnum.INSTANCE进行访问,这样也就避免调用getInstance方法,更重要的是使用枚举单例的写法,我们完全不用考虑序列化和反射的问题...但是这总不是万能的,对于android平台这个可能未必是最好的选择,在android开发中,内存优化是个大块头,而使用枚举时占用的内存常常是静态变量的两倍还多,因此android官方在内存优化方面给出的建议是尽量避免在...= " + keyType); } 接着通过int index = key.ordinal()的方式获取到该枚举实例的顺序值,利用此值作为下标,把值存储在vals数组对应下标的元素中即vals[index

    1.3K10

    看完这篇文章,解决 APP 中 90 % 的内存异常问题

    在 Android 中我们写的 .java 文件,最终会编译成 .class 文件, class 又由类装载器加载后,在 JVM 中会形成一份描述 class 结构的元信息对象,通过该元信息对象可以知道...线程共享区 方法区 ClassLoader 加载类信息 常量、静态变量 编译后的代码 会出现 OOM 运行时常量池 public static final 符号引用类、接口全名、方法名 java 堆...解决方法: ``` 1.使用静态内部类 + 弱引用 2.在 Activity onDestoty() 中处理 removeCallbacksAndMessages() @Override...枚举优化 缺点: 每一个枚举值都是一个单例对象,在使用它时会增加额外的内存消耗,所以枚举相比与 Integer 和 String 会占用更多的内存 较多的使用 Enum 会增加 DEX 文件的大小,会造成运行时更多的...static , static final 的问题 static 会由编译器调用 clinit 方法进行初始化 static final 不需要进行初始化工作,打包在 dex 文件中可以直接调用,并不会在类初始化申请内存

    76830

    每个C++开发者都应该学习和使用的C++11特性

    unsetunset4、override和finalunsetunset 在 C++11 中,override 和 final 是两个关键字,用于在派生类中重写(override)和禁止重写(final...}; 在派生类中使用 override 关键字,如果没有正确地重写基类中的虚函数,编译器会产生错误。...这样可以避免一些常见的错误,如函数签名不匹配等。 2. final 关键字 final 关键字用于修饰类和虚函数,表示禁止派生类继续派生或者禁止派生类重写该虚函数。...value, "int is not the same as int"); 类型特征可以帮助我们在模板编程中编写更加通用和健壮的代码,根据类型的属性进行编译时的分支选择和静态断言,从而提高代码的可读性和可维护性...移动语义的使用场景: 在容器中插入临时对象: 通过移动语义,可以避免在容器中插入临时对象时进行深拷贝,提高了插入的效率。

    7810

    Java中枚举的线程安全性及序列化问题

    当我们使用enmu来定义一个枚举类型的时候,编译器会自动帮我们创建一个final类型的类继承Enum类,所以枚举类型不能被继承,我们看到这个类中有几个属性和方法。...因为static类型的属性会在类被加载之后被初始化,我们在深度分析Java的ClassLoader机制(源码级别)和Java类的加载、链接和初始化两个文章中分别介绍过,当一个Java类第一次被真正使用到的时候静态资源被初始化...在单例模式的七种写法中,我们看到一共有七种实现单例的方式,其中,Effective Java作者Josh Bloch 提倡使用枚举的方式,既然大神说这种方式好,那我们就要知道它为什么好?...,有一种解决办法就是使用readResolve()方法来避免此事发生。...3.枚举实例创建是thread-safe(线程安全的) 我们在深度分析Java的ClassLoader机制(源码级别)和Java类的加载、链接和初始化两个文章中分别介绍过,当一个Java类第一次被真正使用到的时候静态资源被初始化

    1.3K10

    Kotlin初探

    声明类型 函数 操作符 数组遍历及控制语句 类与枚举 扩展 代理 伴生对象 单例模式 扩展学习 1 优势 简洁 它大大减少你需要写的样板代码的数量。 安全 避免空指针异常等整个类的错误。...通用 构建服务器端程序、Android 应用程序或者在浏览器中运行的前端程序。 互操作性 通过 100% Java 互操作性,利用 JVM 既有框架和库。.../抽象类标示 final //标示类不可继承,默认属性 enum //标示类为枚举 open //类可继承,类默认是final的 annotation //注解类 private /...上面使用了字符模板,在Kotlin中有两种字符模板形式,\、 枚举 在Kotlin中枚举还支持方法。...10 扩展 使用 11 代理 12 伴生对象 伴生对象(companion object )类似于java中的静态关键字static。

    1.6K20

    如何成为Android高手

    下面笔者为大家介绍几个通用的类,这些类来自笔者平日的收集,如果你能把它们加入到你自己的类库中,迟早你会发现自己在进行Android 开发的时候受益无穷: 1) 从输入流中获取数据并以字节数组返回,...此类的例子在Android 随处可见,例如说数据库的管理类,例如说Android 中SAX 的Handler 的调用等。...避免使用枚举 枚举变量非常方便,但不幸的是它会牺牲执行的速度和并大幅增加文件体积。...在它被首次调用时,这个类会调用初始化方法来准备每个枚举变量。每个枚举项都会被声明成一个静态变量,并被赋值。然后将这些静态变量放在一个名为”$VALUES”的静态数组变量中。...一方面说,使用枚举变量可以让你的API 更出色,并能提供编译时的检查。所以在通常的时候你毫无疑问应该为公共API 选择枚举变量。但是当性能方面有所限制的时候,你就应该避免这种做法了。

    88930

    Kotlin Vocabulary | 枚举和 R8 编译器

    使用 Kotlin 时,也仅仅是将其转换为 Java 编程语言中的枚举而已,并没有多大开销。(我们曾经提到避免使用枚举,但那是很多年前的事了,而且运行时也与今日不同。所以现在使用枚举没什么问题。)...这个数组是从哪来的呢? 而且这个数组存储在一个被生成的类文件中。这个类文件是从哪来的? 这里究竟发生了什么呢?...生成的代码就像下面这样: public final class BlendingKt$WhenMappings { public static final int[] $EnumSwitchMapping...这个类里面有一个存储映射信息的数组: $EnumSwitchMapping$0,接下来则是一些执行映射操作的静态代码。 示例中是只有一个 when 语句时的情况。...比如,它能避免枚举映射造成的开销: 它不需要那些映射信息,因为它知道这些代码只会以既定的方式使用这些枚举,所以它可以直接调用序数值。

    1K50

    01.单例模式设计思想

    单例模式特点构造函数不对外开放,一般为private通过一个静态方法或者枚举返回单例类对象确保单例类的对象有且只有一个,尤其是在多线程的环境下确保单例类对象在反序列化时不会重新构造对象1.3 单例模式定义保证一个类仅有一个实例...1.4 思考几个问题网上有很多讲解单例模式的文章,但大部分都侧重讲解,如何来实现一个线程安全的单例。重点还是希望搞清楚下面这样几个问题。为什么要使用单例?单例存在哪些问题?单例与静态类的区别?...如果我们在 Singleton 类中创建一个内部类来实现成员变量的初始化,则可以避免多线程下重复创建对象的情况发生。...{ INSTANCE; public void whateverMethod() { }}代码分析枚举单例模式最大的优点就是写法简单,枚举在java中与普通的类是一样的,不仅能够有字段...}}代码分析:在程序的初始,将多种单例模式注入到一个统一的管理类中,在使用时根据key获取对应类型的对象。

    14310

    单例模式探究

    单例模式的五种写法: 懒汉 恶汉 静态内部类 枚举 双重校验锁 1.懒汉 class LazySingleton{ private static LazySingleton...虽然Effective Java中推荐使用,但是在Android平台上却是不被推荐的。...指的是在一个线程中对该变量的修改会马上由工作内存(Work Memory)写回主内存(Main Memory),所以会马上反应在其它线程的读取操作中。 第二层语义是禁止指令重排序优化。...(2)单例模式可以避免对资源的多重占用,例如一个文件操作,由于只有一个实例存在内存中,避免对同一资源文件的同时操作。...(3)单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如,可以设计一个单例类,负责所有数据表的映射处理。

    38320

    JDK中枚举的底层实现

    JDK的枚举描述 国际惯例,先看一下JavaSE-8的语言规范中JLS-8.9对枚举类型的定义和描述: ?...枚举类型不能使用abstract或者final修饰,否则会产生编译错误。 枚举类型的直接超类是java.lang.Enum。 枚举类型除了枚举常量定义之外没有其他实例,也就是枚举类型不能实例化。...枚举类型禁用反射操作进行实例化(这个特性就是Effetive Java中推荐使用枚举实现单例的原因)。...小结 JDK中枚举的底层实现就是使用了enum关键字声明的枚举类编译后最终会变成public final修饰同时实现了继承了泛型抽象类java.lang.Enum并且指定泛型参数为自身的普通Java类,...而成员属性和方法实现相关都是在编译完成后就已经成型的,枚举类型的成员变量都是通过静态代码块声明的。

    86920

    Java中不可或缺的50个小技巧,好用!

    例如,只创建了对象,设置了标题,却没有尺寸,相当于创建了一个没有尺寸的警告框。 在Android中,大量的控件都使用了构造器Builder。... Elvis(){} } 另一种情况,在序列化的过程中,反序列化得到的对象已经不再是以前的对象(破坏了Singleton),这种情况下,可以通过单元素枚举型处理。...22、优先考虑静态类成员 嵌套类的目的应该只是为了他的外围类提供服务,如果以后还可能用于其他环境中,则应该设计为顶层类。静态类相当于一个普通的外部类,只是恰好声明在了一个类内部。...通常的用户是:Calculator.Operation.PLUS等。和普通类的区别只是,在PLUS前,有了2个前缀,来表明其含义。而非静态类必须存在于外部类对象中。...{ NAVEL, TEMPLE, BLOOD } 枚举型在java中非常强大,当需要一组固定常量时,使用enum比int好很多。

    57300

    Java接地气日常编码技巧

    例如,只创建了对象,设置了标题,却没有尺寸,相当于创建了一个没有尺寸的警告框。 在Android中,大量的控件都使用了构造器Builder。...Elvis(){} } 另一种情况,在序列化的过程中,反序列化得到的对象已经不再是以前的对象(破坏了Singleton),这种情况下,可以通过单元素枚举型处理。...静态类相当于一个普通的外部类,只是恰好声明在了一个类内部。通常的用户是:Calculator.Operation.PLUS等。和普通类的区别只是,在PLUS前,有了2个前缀,来表明其含义。...而非静态类必须存在于外部类对象中。不要手动在外部创建一个内部非静态类对象,创建的过程是:instance.New MemberClass()。这非常奇怪。...{ NAVEL, TEMPLE, BLOOD } 枚举型在java中非常强大,当需要一组固定常量时,使用enum比int好很多。

    64330

    深入理解Enum(枚举类)

    为什么要引入枚举类 一个小案例 你写了一个小程序,不过好久不用了,突然有一天,你想使用一下它。程序要想正确运行,需要将今天星期几存到数据库里。这个时候,你开始犯难了。...就是因为在没有枚举类的时候,我们要定义一个有限的序列,比如星期几,男人女人,春夏秋冬,一般会通过上面那种静态变量的形式,但是使用那样的形式如果需要一些其他的功能,需要些很多奇奇怪怪的代码。...在其他类中使用enum变量的时候,只需要【类名.变量名】就可以了,和使用静态变量一样。...学完了这些,大概枚举类你也应该掌握了,但是,还有没有其他用法呢? 枚举类中的抽象类 如果我在枚举类中定义一个抽象方法会怎么样? 你要知道,枚举类不能继承其他类,也不能被其他类继承。...,如果需要扩展enum中的元素,在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组。

    64030
    领券