Java枚举的性能

Jac*_*ack 5 java enums internationalization

我正在考虑使用enum类型来管理我正在开发的Java游戏中的i18n,但我对使用具有大量元素的枚举(我认为数千个)时可能出现的性能问题感到好奇.

其实我正在尝试这样的事情:

public enum Text {
  STRING1,
  STRING2,
  STRING3;

  public String text() {
    return text;
  }

  public String setText() {
    this.text = text;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后加载它们我可以填写字段:

static
{
  Text.STRING1.setText("My localized string1"); 
  Text.STRING2.setText("My localized string2"); 
  Text.STRING3.setText("My localized string3"); 
}
Run Code Online (Sandbox Code Playgroud)

当然,当我必须管理多种语言时,我会从文件中加载它们.

我问的是

  • 是一个为每个元素分配的(除字符串之外的)obect?(我想是的,因为枚举是用对象实现的)
  • 如何从枚举中检索出正确的元素?它在编译时是静态的吗?(我的意思是在我使用的某个地方Text.STRING1.text()).所以它应该是恒定的复杂性,或者它们可能只是在编译阶段被替换.
  • 一般来说,这是一个好方法还是我应该期待别的什么?

谢谢

And*_*s_D 14

找到并调整了很好的enum和ResourceBundle组合:

public enum Text {
  YELL, SWEAR, BEG, GREET /* and more */ ;

  /** Resources for the default locale */
  private static final ResourceBundle res =
    ResourceBundle.getBundle("com.example.Messages");

  /** @return the locale-dependent message */
  public String toString() {
    return res.getString(name() + ".string");
  }
}
Run Code Online (Sandbox Code Playgroud)
# File com/example/Messages.properties
# default language (english) resources
YELL.string=HEY!
SWEAR.string=§$%&
BEG.string=Pleeeeeease!
GREET.string=Hello player!
Run Code Online (Sandbox Code Playgroud)
# File com/example/Messages_de.properties
# german language resources
YELL.string=HEY!
SWEAR.string=%&$§
BEG.string=Biiiiiitte!
GREET.string=Hallo Spieler!
Run Code Online (Sandbox Code Playgroud)


Cam*_*ner 11

你可能最好使用这java.util.ResourceBundle门课.它旨在解决这个问题.

回答你的问题:

  1. 是的,每个枚举值只有一个实例.
  2. 是的,查找Enum值的常数复杂性.
  3. 并不是的.改变枚举类型的内容/行为会破坏首先使用枚举的目的.它们应该代表具有类型安全性的固定范围常量.你可以做这种事情,但这不是他们的设计目的.

  • 你可以在某处拥有一大堆静态最终字符串.所以Text类可以有`public final static String STRING1 ="STRING1"`并且你用`getString(Text.STRING1)`查找资源包.您的代码现在看起来与使用Enum完全一样,IDE应该识别常量.如果需要,您甚至可以使用静态导入. (2认同)

Pow*_*ord 7

我讨厌劫持主题,但依靠i18n的枚举最终会让你陷入困境.Java有适当的i18n支持,甚至可以获得它的教程.