在内存方面使用枚举对许多常量有效吗?

Art*_*rez 2 java enums constants java-8

我有一个看起来像这样的类:

public class MessageBuilder{

  private enum MsgCodes{

    CODE_1("some string"),
    CODE_2("another string"),
    CODE_3("you get the idea");

    private String msg;

    MsgCodes(String msg){
      this.msg = msg;
    }

    private String text(){
      return msg;
    }
  }

  private MessageBuilder(){
    //prevents initialization outside the class
  }

  //Gives synchronized behaviour to initialization without enforcing it into getInstance()
  private static class Loader{
    static MessageBuilder INSTANCE = new MessageBuilder();
  }

  public static MessageBuilder getInstance(){
    return Loader.INSTANCE;
  }

  public String buildMessage(String[] codes){
    String res = "";
    for(String code : codes){
      res += QAmsg.valueOf(code).text();
    }
    return res;
  }

}
Run Code Online (Sandbox Code Playgroud)

我担心的是加班(意思是应用程序开发)我会enum在这个类上有越来越多的东西(我理解这不仅是一个好的,甚至是保持常量只用于一个类的首选方法),我相当新对enum,所以我真的不知道,如果这个名单变成"过大"会变成这样还是一种有效的方式,让他们会发生什么?

是否有不同的方法,我可以用这样不是整个名单,但只是一个代码,我使用的时候被实例化?这些enum实例只有一次,还是每次使用它时都会实现一切?

我让这个类成为单身人士,认为这会阻止我enum不止一次实例化列表,但这可能是不必要的,因为我不完全理解enum行为.

Mar*_*nik 7

枚举成员只是public static final常数,因此是单身人士.假设您的列表增长到10,000个枚举成员,每个成本为1 KB.即使在这些奢侈的假设下,它也将达到10 MB的Java堆.

很明显,你不应该担心枚举成员的内存消耗.

  • 根据经验,您可以在静态初始化块过大之前获得4K枚举.;) (4认同)
  • 是的,编译器没有这样做,因为它是一个罕见的用例,但至少它_could_做它并保持在规范内?它总是可以将方法拆分为子方法. (2认同)
  • 它也为初始化数组的大小创建了一个限制.如果你有一个大的预定义数组,你就不能有这么多的枚举值.如果你为每个构造函数添加一个参数,你就不能有这么多:( (2认同)