在此代码中,我得到一个编译器错误,请参见注释:
public enum Type {
CHANGESET("changeset"),
NEW_TICKET("newticket"),
TICKET_CHANGED("editedticket"),
CLOSED_TICKET("closedticket");
private static final Map<String, Type> tracNameMap = new HashMap<String, Type>();
private Type(String name) {
tracNameMap.put(name, this); // cannot refer to static field within an initializer
}
public static Type getByTracName(String tn) {
return tracNameMap.get(tracNameMap);
}
}
有没有一种方法可以使这项工作有效,可以Map
通过其中一个字段从a获取枚举值?
该地图在这里可能是过大的。除非您打算使用四个以上的枚举值,否则可以通过简单地遍历有效字符串并返回正确的字符串来实现getByTracName(String
tn)。如果映射键始终是枚举名称,则可以执行以下操作:
public enum Type {
CHANGESET,
NEW_TICKET,
TICKET_CHANGED,
CLOSED_TICKET;
private static final Map<String, Type> tracNameMap = new HashMap<String, Type>();
static {
for (Type t:Type.values()) {
tracNameMap.put(t.name(), t);
}
}
public static Type getByTracName(String tn) {
return tracNameMap.get(tracNameMap);
}
}
或者您可以执行以下操作:
public static Type getByTracName(String tn) {
return Enum.valueOf(Type.class,tn);
}
我正在设计一款纯文字的电子游戏,游戏中的两个角色不常出现在一起,但在内心和性格上非常相似。 我的问题是,我不知道如何通过使用静态最终内部常量的构造函数初始化常量。否则这场比赛就可以开始了 这是一个两难的问题: 如果我没弄错的话,枚举常量必须在枚举的第一行定义 我如何解决这个第22条军规? 以下是根据保密协议从游戏中发布的一些示例代码: 我试图用马里奥的“典型”来初始化SUPERMARIO,但我还没
当一个类本身有一个静态实例时,我很难理解初始化顺序。另外,为什么
问题内容: Java中的静态和非静态枚举有什么区别?两种用法是相同的。 正确吗 所有静态的都在启动时加载到内存中,非静态的则按需加载 ? 如果是,那么哪种方法更好?将某些数据始终保留在内存中还是每次使用服务器资源加载它们? 问题答案: 所有的都是有效的。如果您有嵌套的枚举,则它与相同。 所有类都是延迟加载的(枚举或其他),但是在加载时,它们会一次全部加载。也就是说,您不能加载一些常量,而不能加载其
问题内容: 如标题所示,两者之间到底有什么区别 和 除了结构以外,还有什么重要区别吗? 问题答案: 对于您的示例,没有区别。但是如您所见, 只能接受一个表达式来初始化变量。但是,在静态初始化器(JLS 8.7)中,可以执行任意数量的语句。例如,可以这样做: 对于您的示例,显然不需要这样做,但是变量的初始化可能不仅仅使用表达式,甚至可能包含许多语句,因此Java制作了静态初始化器。
问题内容: 我正在尝试发现初始化发生的顺序,或者更确切地说,为什么要按此顺序进行初始化的原因。给定代码: 输出: 但是,将的声明移动到初始化块之前会产生: 而且我完全不知道为什么会以这种顺序发生。此外,如果我在的声明中消除了关键字,则init块和构造函数均不会触发。谁能帮我这个忙吗? 问题答案: 我认为您只是缺少JLS的12.4.2节,其中包括: 接下来,以文本顺序执行类的类变量初始化器和静态初始
问题内容: 下面的程序打印: 首次加载类时,首先要初始化静态块和字段,然后才初始化实例块和字段。因此,应首先初始化变量“ objectName1”和“ objectName2”,然后初始化实例变量“ list”……但输出显然与该理论相矛盾……任何人都可以解释程序行为(我不是在批评程序)。设计本身顺便说一句)? 问题答案: 静态块 按顺序 初始化(因此您可以在下面的代码中依赖上面的代码)。通过在中创