Java中的枚举类型是存储在Java运行期的那个区域?为什么单例模式用枚举就完美解决了?
枚举的内存分配是发生在什么时候?初始化又是啥发生在什么时候?代码中使用枚举时候,发生了什么事情?
PHP中文网2017-04-18 10:52:17
Enumerations in Java exist in
Method Area
(method area)
public enum T {
E1, E2
}
The above code is compiled as follows:
$ javap T.class
Compiled 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 {};
}
You can find that constants are actually compiled into static variables in the end. Static variables in Java are stored in Method Area
.
单例模式
的目的是为了保证在内存中只存在唯一一个实例,而枚举值
is fixed just enough to achieve the purpose of controlling the number of instancesThe traditional method of bypassing access control
class
实现单例与enum
不同之处呢,在于使用使用class
需要将constructor
访问级别设置为private
如果还要防止reflect
creating objects requires additional processing as follows: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); } }
reply0