Java中的枚举类型存储在Jvm运行期的那个区域?为什么单例模式用枚举就完美解决了?
PHP中文网
PHP中文网 2017-04-18 10:50:17
0
1
556

Java中的枚举类型是存储在Java运行期的那个区域?为什么单例模式用枚举就完美解决了?

枚举的内存分配是发生在什么时候?初始化又是啥发生在什么时候?代码中使用枚举时候,发生了什么事情?

PHP中文网
PHP中文网

认证0级讲师

membalas semua (1)
洪涛

Java中枚举存在在Method Area(方法区)

public enum T { E1, E2 }

上面这段代码编译后如下:

$ javap T.class Compiled from "T.java" public final class io.zhudy.web.T extends java.lang.Enum { 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); } }
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan
    Tentang kita Penafian Sitemap
    Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!