Java 在内存方面,对许多常量使用枚举是否有效?

Java 在内存方面,对许多常量使用枚举是否有效?,java,enums,java-8,constants,Java,Enums,Java 8,Constants,我有一个类似这样的类: 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

我有一个类似这样的类:

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

}
我担心的是,随着时间的推移(意味着随着应用程序的发展),我在这个类上会有越来越多的
enum
(我知道这不仅是一个很好的方法,甚至是只在一个类上使用常量的首选方法),我对
enum
相当陌生,所以我真的不知道如果这个列表变得“太大”会发生什么这仍然是一种有效的方式来保留它们吗

有没有一种不同的方法可以让我使用的不是整个列表,而是我当时使用的一个代码得到实例化?
enum
实例是只实例化一次,还是每次我使用它们时都会实例化


我将类设为单例类,认为这会阻止我多次实例化
enum
列表,但这可能是不必要的,因为我不完全理解
enum
行为。

enum成员只是
公共静态final
常量,因此是单例。假设您的列表增加到10000个枚举成员,每个成员的开销为1KB。即使在这些奢侈的假设下,它也将达到10MB的Java堆


显然,您不应该担心枚举成员的内存消耗。

效率和内存与此无关。在以后的设计中,如果使用多个硬编码枚举,它可能会成为一个不太理想的解决方案。@Kayaman你真的认为这个问题完全是重复的吗?我移动到reopen.BTW,因为
MessageBuilder
只能有一个实例,您可以使用一个实例将其作为枚举。这将简化代码。枚举可能变坏的一种方法是,如果您要经常更改它们的定义,尤其是如果您所做的更改仅局限于枚举成员。在这种情况下,您将被迫在每次更改时重建和重新部署整个项目,而不是动态更改某些配置文件。作为
enum
不会使其方法同步或以任何方式更改它们,尽管您可以在需要时这样做。根据经验,在静态初始化块变得太大之前,您可以拥有大约4K的枚举,这并没有实际的性能差异(不过间接性会减少)。)由于字节码指令计数的64 K限制,对吗?编译器可以通过拆分成几个静态init方法来绕过它?
enum
使用与任何其他对象几乎相同的内存。如果有数千个枚举值或数千个对象,则不会有多大区别+1是的,编译器没有这样做,因为这是一个罕见的用例,但至少它可以这样做并保持在规范内?它总是可以将方法拆分为子方法。它还为初始化数组的大小创建了一个限制。如果有一个大的预定义数组,则不能有那么多的枚举值。如果向每个构造函数添加一个参数,则不能有那么多:(