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'instances
La différence entre l'utilisation traditionnelle de class pour implémenter des singletons et enum est que l'utilisation de class nécessite de définir le niveau d'accès constructor sur private si vous souhaitez empêcher reflect 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);
}
}
Le code ci-dessus est compilé comme suit :
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
.