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

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

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

PHP中文网
PHP中文网

认证0级讲师

全員に返信(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<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 リーリー 上記のコードは次のようにコンパイルされます:

リーリー
Java の静的変数は、最終的には実際に静的変数にコンパイルされ、メソッド領域 に格納されることがわかります。 🎜 🎜 🎜シングルケースモードの目的は、メモリ内に🎜インスタンス🎜が1つだけ存在し、列挙値が数を制御するのに十分なだけ🎜固定🎜であることを保証することです。インスタンスの目的 🎜 🎜シングルトンを実装するための従来の class の使用と enum の違いは、class の使用には constructor へのアクセスが必要であることです。レベルが private に設定されている場合、reflect によるアクセス制御🎜オブジェクトの作成🎜を回避するには、次のように追加の処理を行う必要があります:🎜 🎜 リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート