Maison > Questions et réponses > le corps du texte
Java中的枚举类型是存储在Java运行期的那个区域?为什么单例模式用枚举就完美解决了?
枚举的内存分配是发生在什么时候?初始化又是啥发生在什么时候?代码中使用枚举时候,发生了什么事情?
PHP中文网2017-04-18 10:52:17
Les énumérations en Java existent dans
Method Area
(zone de méthode)
public enum T {
E1, E2
}
Le code ci-dessus est compilé comme suit :
$ 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 {};
}
Vous pouvez constater que les constantes sont en fait compilées en variables statiques à la fin. Les variables statiques en Java sont stockées dans Method Area
.
Le but de
单例模式
est de garantir qu'il n'y a qu'une seule instance dans la mémoire, et枚举值
est fixe ce qui peut simplement atteindre l'objectif de contrôler le nombre d'instancesLa différence entre l'utilisation traditionnelle de
class
pour implémenter des singletons etenum
est que l'utilisation declass
nécessite de définir le niveau d'accèsconstructor
surprivate
si vous souhaitez empêcherreflect
de contourner l'accès. Pour contrôler la création d'un objet , un traitement supplémentaire doit être effectué comme suit :
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);
}
}