Java 枚举类型原理分析为什么枚举比用静态变量多消耗两倍的内存

article/2025/7/11 21:54:19

一 起源:枚举是一种特殊的数据类型,一般用来列举有限个、同类型的常量。它能保证参数的安全性,如方法声明传入的参数,必须是指定枚举中的常量。但是Android开发文档指出,使用枚举会比使用静态变量多消耗2倍内存。为什么枚举这么耗内存?

二 枚举原理:

定义枚举类  Week  星期一 到 星期五

public enum Week {MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY
}

1、使用Android Studio  ReBuildProject 功能会编译成.class子节 码文件

2 在 app/build/intermediates/classes/debug/里找到生成的子节码文件为

package com.example.xu.mycustomviewdemo;public enum Week {MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY;private Week() {}
}

3、用jad反编译.class文件,生成Week.jad,jad的下载地址:http://www.javadecompilers.com/jad

jad的使用方法:jad

打开Week.jad为

package com.example.xu.mycustomviewdemo;
public final class Week extends Enum
{public static Week[] values(){return (Week[])$VALUES.clone();}public static Week valueOf(String name){return (Week)Enum.valueOf(com/example/xu/mycustomviewdemo/Week, name);}private Week(String s, int i){super(s, i);}public static final Week MONDAY;public static final Week TUESDAY;public static final Week WEDNESDAY;public static final Week THURSDAY;public static final Week FRIDAY;private static final Week $VALUES[];static {MONDAY = new Week("MONDAY", 0);TUESDAY = new Week("TUESDAY", 1);WEDNESDAY = new Week("WEDNESDAY", 2);THURSDAY = new Week("THURSDAY", 3);FRIDAY = new Week("FRIDAY", 4);$VALUES = (new Week[] {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY});}
}

从反编译的代码来看,我们定义的枚举,编译器会将其转换成一个类,这个类继承自java.lang.Enum类,除此之外,编译器还会帮我们生成多个枚举类的实例,赋值给我们定义的枚举类型常量【即static包里】,并且还声明了一个枚举对象的数组,保存了所有的枚举对象。生成的诸多对象,对象数组,远比静态变量占据内存多。

三 替代枚举的方法:

方法一 注解

1 官方提供的注解库

  1. compile 'com.android.support:support-annotations:24.2.0'  

2 定义

@IntDef({NewWeek.MONDAY, NewWeek.TUESDAY})
@Retention(RetentionPolicy.SOURCE)
public @interface NewWeek {public static final int MONDAY = 0;public static final int TUESDAY = 1;
}

3 使用

private void setEnum(@NewWeek int  week){。。}

setEnum(NewWeek.MONDAY);

方法二:接口常量

接口变量默认都是public static final的也就是常量形式

public interface WeekInterface {int Monday = 0;int TUESDAY = 1;
}

jad 反编译子节码为:

interface WeekInterface {public static final int Monday;public static final int TUESDAY;
}

四 枚举实现单例

首先枚举里可以声明类,实例变量 和方法

enum Type{A,B,C,D;static int value;public static int getValue() {return value;}String type;public String getType() {return type;}
}

枚举定义单例:

/***  需要被实例的类*/public class MediaManager {
}

枚举实现MediaManager单例

public enum  MediaManagerCreater {// 枚举实例CREATERINSTANCE ;// 要被生名单例类的对象private MediaManager mediaManager;// 枚举构造   只生成一次MediaManagerCreater(){mediaManager = new MediaManager();}/***  获取对应实例*/public MediaManager getManagerInstance(){return mediaManager;}
}

获取单例为:

  MediaManagerCreater.CREATERINSTANCE.getManagerInstance();

原理:

1 枚举的构造函数是私有的

我们访问枚举实例时会执行构造方法,同时每个枚举实例都是static final类型的,也就表明只能被实例化一次



http://chatgpt.dhexx.cn/article/kj7SagNj.shtml

相关文章

java枚举转json

1、背景 java后端的枚举类型,要展示到前端,提供给用户进行下拉选择,java后端需要封装enum为json字符串提供给前端,需要首先将枚举类型转为list,然后再转为json字符串。 2、方案 方案也很简单,使用EnumSe…

枚举类的使用

文章目录 前言一、自定义枚举类二、使用enum定义枚举类1.Enum类的主要方法2.实现接口的枚举类 前言 1) 类的对象只有有限个,确定的。举例如下: 星期:Monday(星期一)、…、Sunday(星期天) 性别:Man(男)、Woman(女) 季节…

用户名枚举

一. 漏洞描述 常存在于系统登录界面,由于错误配置或设计缺陷,当向系统提交有效账户和无效账户时,服务器会有不同的响应,利用服务器响应的不同,攻击者可以获取到系统已经存在的账户,可用于暴力破解&#xff…

c++枚举

一、枚举类型的定义 枚举类型的定义&#xff1a;枚举类型(enumeration)是 C 中的一种派生数据类型&#xff0c;它是由用户定义的若干枚举常量的集合。 定义格式&#xff1a;枚举类型的定义格式为&#xff1a;enum <类型名> {<枚举常量表>}; 例如&#xff1a; en…

java枚举类及面试题为什么枚举实现单例模式是安全的?

目录 枚举类为什么会有枚举类&#xff1f;枚举类的使用枚举类的常用方法枚举的构造 枚举类型能被反射吗&#xff1f;为什么枚举实现单例模式是安全的&#xff1f; 枚举类的优缺点 枚举类 为什么会有枚举类&#xff1f; 假如说程序中有一些颜色的状态&#xff0c;或者说消息的类…

什么是枚举?

枚举有两种存在形式&#xff1a; 第一种是计算机编程语言的一种数据类型&#xff0c;enum&#xff0c;即枚举类型。在实际问题中&#xff0c;一些变量的取值被限制在一个有限的范围内&#xff0c;例如&#xff1a;一个星期内只有七天&#xff0c;一年只有十二个月…C语言为此提…

什么是枚举【详解】

本期介绍&#x1f356; 主要介绍&#xff1a;什么是枚举&#xff0c;枚举是如何定义、初始化的&#xff0c;以及枚举到底如何使用&#xff0c;还有枚举这种语法存在的优点有那些&#x1f440;。 文章目录 一、什么是枚举&#x1f356;二、枚举类型的定义&#x1f356;三、枚举…

输入文字后不会自动变长的下划线如何制作

问题&#xff1a;设置下划线时&#xff0c;随着文字增多&#xff0c;下划线延长&#xff0c;出现不对齐的情况 &#xff0c;如下图 解决&#xff1a;制作表格&#xff0c;把不需要的边框删除&#xff0c;就我现在需要的效果&#xff0c;实现步骤如下 制作表格 设置单元格的边距…

CSDN中用Markdown如何给文本加下划线(可延长下划线)

解决 使用<u></u>把文字包起来即可。 演示 <u>下划线</u>&#xff0c;效果&#xff1a; 下划线 如何延长下划线 如果想延长下划线&#xff0c;我们会发现直接打空格是没用的&#xff0c;<u>  下划线   </u>&#xff0c;效果&…

css鼠标划过文字出现往两边延伸的下划线

HTML&#xff1a; <div class"nav"><ul><li><a href"#">Gravit Designer</a></li><li><a href"#">Gravit Klex</a></li></ul></div> CSS&#xff1a; /*导航*/.nav{…

【深入理解JS核心技术】12. 什么是一阶函数

一阶函数是一个不接受另一个函数作为参数并且不返回函数作为其返回值的函数。 const firstOrder () > console.log("I am a first order function!"); 复制代码 函数名 函数名就是指向函数的指针&#xff0c;一个函数可以有多个名称。 function sum(num1, num2) …

一个正经的前端学习 开源 仓库(阶段十九)

低调务实优秀中国好青年 (简介) && 附加答案 中文 | English github.com/webVueBlog/… 一个 ☝️ 正经的前端学习 开源 仓库&#xff0c;启发来自 淘宝大佬 冴羽 &#xff0c;初心做一个真正能帮助到大家的仓库。&#xff08;非常口语化的&#xff0c;手写总结&#x…

【深入理解JS核心技术】1.在 JavaScript 中创建对象的可能方式有哪些?

创建对象的方式&#xff1a; 创建空对象&#xff0c;可以使用Object构造函数。&#xff08;对象构造函数&#xff09; var object new Object(); 复制代码 可以使用Object的create方法通过将原型对象作为参数来创建一个新对象 var object Object.create(null); 复制代码 可以…

一个正经的前端学习 开源 仓库(阶段十七-440)

低调务实优秀中国好青年 (简介) && 附加答案 中文 | English github.com/webVueBlog/… 一个 ☝️ 正经的前端学习 开源 仓库&#xff0c;启发来自 淘宝大佬 冴羽 &#xff0c;初心做一个真正能帮助到大家的仓库。&#xff08;非常口语化的&#xff0c;手写总结&#x…

【深入理解JS核心技术】11. 什么是一级函数

在 Javascript 中&#xff0c;函数是第一类对象。一等函数意味着当该语言中的函数被视为任何其他变量时。 例如&#xff0c;在这种语言中&#xff0c;一个函数可以作为参数传递给其他函数&#xff0c;可以由另一个函数返回&#xff0c;也可以作为一个值分配给变量。例如&#x…

一个正经的前端学习 开源 仓库(每日更新)-698道知识点

低调务实优秀中国好青年 (简介) && 附加答案 中文 | English 一个 ☝️ 正经的前端学习 开源 仓库&#xff0c;养成一个好习惯&#xff0c;遇见更好的 自己。一个人可能走得更快&#xff0c;但一群人会走得更远。&#xff08;非常口语化的&#xff0c;手写总结&#xf…

坚持每一天,不忘初心,正经的前端学习(705)

正经的前端学习 中文 | English 一个 ☝️ 正经的前端学习 开源 仓库&#xff0c;每天进步一点&#xff01;欢迎大家前来讨论&#xff0c;如果觉得对你的学习有一定的帮助&#xff0c;欢迎点个Star &#xff08;此仓库每天都会手动更新&#xff09; &#x1f339; &#x1f339…

VB.net:VB编程语言/VB.net语言编程的简介、IDE安装、学习路线(几十项案例代码实现)之详细攻略

VB.net&#xff1a;VB编程语言/VB.net语言编程的简介、IDE安装、学习路线(几十项案例代码实现)之详细攻略 目录 VB编程语言的简介 1、VB编程语言、VBA编程语言、VBS编程语言、VB.net编程语言对比 2、VB语言对比VB.net语言 (1)、VB6.0之前——.NET Framework 引入之前 (2)、…

vue3手动封装一个点击切换下滑线,事件委托,实现简易选项卡

点击切换下滑线 看看效果 body主要代码&#xff1a; 把点击事件绑定到父元素身上&#xff0c;因为把每个li都绑定一个事件工作量太大了&#xff0c;也不显示&#xff1b;所以利用事件委托 <ul click"disPlay"><li class"wy">网页端</l…

【参赛时间延长】InterSystems技术写作大赛:Python

嗨&#xff0c;开发者们&#xff01;欢迎加入第二届InterSystems技术写作大赛&#xff01; &#x1f40d; InterSystems技术写作大赛&#xff1a;Python &#x1f40d; 6月20日至七月20日 延长至7月31日&#xff0c;在社区撰写一篇利用InterSystems技术使用Python的文章&#x…