搜尋

首頁  >  問答  >  主體

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

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

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

PHP中文网PHP中文网2802 天前625

全部回覆(1)我來回復

  • PHP中文网

    PHP中文网2017-04-18 10:52:17

    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<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);
        }
    }

    回覆
    0
  • 取消回覆