Java中的枚举类型存储在Jvm运行期的那个区域?为什么单例模式用枚举就完美解决了?
问题描述
Java中的枚举类型是存储在Java运行期的那个区域?为什么单例模式用枚举就完美解决了?
枚举的内存分配是发生在什么时候?初始化又是啥发生在什么时候?代码中使用枚举时候,发生了什么事情?
问题解答
回答1:Java中枚举存在在Method Area(方法区)
public enum T { E1, E2}
上面这段代码编译后如下:
$ javap T.classCompiled from 'T.java'public final class io.zhudy.web.T extends java.lang.Enum<io.zhudy.web.T> { public static final io.zhudy.web.T E1; public static final io.zhudy.web.T E2; public static io.zhudy.web.T[] values(); public static io.zhudy.web.T valueOf(java.lang.String); static {};}
可以发现常量最后实际都是被编译为静态变量了,Java中静态变量都是存储在Method Area。
单例模式的目的是为了保证在内存中只存在唯一一个实例,而枚举值是固定的刚好可以达到控制实例数的目的
那传统的采用class实现单例与enum不同之处呢,在于使用使用class需要将constructor访问级别设置为private如果还要防止reflect绕过访问控制创建对象,还需要做额外处理如下:
public class T2 { public static final T2 INSTANCE = new T2(); private T2() {if (INSTANCE != null) { throw new AssertionError('实例已存在');} } public static void main(String[] args) throws Exception {Constructor c = T2.class.getDeclaredConstructor();Object o = c.newInstance();System.out.println(o); }}
相关文章:
1. java - mybatis怎么实现在数据库中有就修改,没有就添加2. MYSQL新建用户设置可以远程访问的问题3. $fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题4. python - 求一个在def中可以实现调用本def满足特定条件continue效果的方法(标题说不太清楚,请见题内描述)5. angular.js - angularjs的自定义过滤器如何给文字加颜色?6. javascript - 用表单提交两个时间段请求后台返回对应数据时出现的一些问题!7. node.js - nodejs和前端JavaScript 字符串处理结果不一样是什么原因?8. mysql - 我的myeclipse一直连显示数据库连接失败,不知道为什么9. mysql - SQL操作时间的函数?10. mysql 为何insert的时候会有lock wait timeout 异常
![$fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题](http://www.haobala.com/attached/image/news/202205/093622cb60.png)