当前位置: 首页 > 知识库问答 >
问题:

如何使用内部静态final字段初始化Java枚举?

沈乐邦
2023-03-14

我正在设计一款纯文字的电子游戏,游戏中的两个角色不常出现在一起,但在内心和性格上非常相似。

我的问题是,我不知道如何通过使用静态最终内部常量的构造函数初始化enum常量。否则这场比赛就可以开始了

这是一个两难的问题:

  1. 如果我没弄错的话,枚举常量必须在枚举的第一行定义

我如何解决这个第22条军规?

以下是根据保密协议从游戏中发布的一些示例代码:

enum ValiantHeroWithPrincessSavingTendencies {

  SUPERMARIO(TYPICAL_QUOTE_FROM_MARIO), ZELDA(TYPICAL_QUOTE_FROM_ZELDA);

  private String aPreparedQuotePurportedToBeSpontaneousAlmostImpulsive;

  public String getQuoteUnderStressfulCircumstances() {
    return aPreparedQuotePurportedToBeSpontaneousAlmostImpulsive;
  }

  private ValiantHeroWithPrincessSavingTendencies(String quote) {
    aPreparedQuotePurportedToBeSpontaneousAlmostImpulsive = quote;
  }

  private static final String TYPICAL_QUOTE_FROM_ZELDA = "Have at ya!";
  private static final String TYPICAL_QUOTE_FROM_MARIO = "We, wagliu'!";
}

我试图用马里奥的“典型”来初始化SUPERMARIO,但我还没有定义马里奥的“典型”。我认为,在SUPERMARIO之前移动私有静态最终字段是非法的。

共有3个答案

岳嘉容
2023-03-14

私有静态最终常量是枚举的本地常量;只需在实例定义中对它们进行编码。在此之后,可以从apreparedquotepurportedtobeasurgeneralmostpulsive变量内部访问它们。

鄢翰藻
2023-03-14

您可以通过类名访问它们:

enum ValiantHeroWithPrincessSavingTendencies {
    SUPERMARIO(ValiantHeroWithPrincessSavingTendencies.TYPICAL_QUOTE_FROM_MARIO),
    ZELDA(ValiantHeroWithPrincessSavingTendencies.TYPICAL_QUOTE_FROM_ZELDA);

    ...

    private static final String TYPICAL_QUOTE_FROM_ZELDA = "Have at ya!";
    private static final String TYPICAL_QUOTE_FROM_MARIO = "We, wagliu'!";
}

这比布莱恩的解决方案更简单

赏夕
2023-03-14

唯一可行的选择是a)将常数移动到另一个类,或者b)直接将常数放入值初始值设定项中。

如果移动常量,可以将该类设置为枚举中的静态类:

enum ValiantHeroWithPrincessSavingTendencies {
  SUPERMARIO(Quotes.TYPICAL_QUOTE_FROM_MARIO),
  ZELDA(Quotes.TYPICAL_QUOTE_FROM_ZELDA);

  private String aPreparedQuotePurportedToBeSpontaneousAlmostImpulsive;

  public String getQuoteUnderStressfulCircumstances() {
    return aPreparedQuotePurportedToBeSpontaneousAlmostImpulsive;
  }

  private ValiantHeroWithPrincessSavingTendencies(String quote) {
    aPreparedQuotePurportedToBeSpontaneousAlmostImpulsive = quote;
  }

  private static class Quotes {
    private static final String TYPICAL_QUOTE_FROM_ZELDA = "Have at ya!";
    private static final String TYPICAL_QUOTE_FROM_MARIO = "We, wagliu'!";
  }
}
 类似资料:
  • 问题内容: 好吧,所以说我有一个看起来像这样的课: 我可以依靠类加载器来按顺序初始化那些字段,以便我可以依靠SERVLET_LOGGER在signupObservableAgent之前实例化吗? 问题答案: 是的,它们按照它们在源中出现的顺序进行了初始化。您可以在Java语言规范§12.4.2中阅读所有详细内容。请参阅步骤9,内容为: …以文本顺序执行类的类变量初始值设定项和静态初始值设定项,或者

  • 静态字段何时初始化?如果我从未实例化过一个类,但我访问了一个静态字段,那么用于实例化私有静态字段的所有静态块和私有静态方法(按顺序)都在那一刻被调用了吗?或者什么时候启动应用程序?

  • 问题内容: 我尝试了解通过引用同一封闭类对象初始化静态字段时初始化顺序的行为。 上面这段代码的输出是: 如果我将变量修改为除plain之外的其他任何内容: 输出为: 为什么会这样呢? 请注意,即使同时声明了两者,输出也是如此,在这种情况下,声明之前 问题答案: 静态最终成员先于其他静态成员初始化。 非最终静态成员按出现顺序初始化 因此,在您的第一种情况下: 构造函数在初始化之前首先被调用,因此被显

  • 问题内容: 你将如何在Java中初始化静态变量? 方法一:静态初始化器 方法二:实例初始化器(匿名子类)或其他方法? 各自的优缺点是什么? 这是说明两种方法的示例: 问题答案: 在这种情况下,实例初始化器只是语法糖,对吗?我不明白为什么你只需要一个额外的匿名类即可进行初始化。如果正在创建的类是最终的,那将是行不通的。 你也可以使用静态初始化程序创建不可变映射:

  • 问题内容: 表示变量只能在构造函数中分配一次。 表示它是一个类实例。 我不明白为什么禁止这样做。这些关键字在哪里互相干扰? 问题答案: 每次创建该类的实例时,都会调用一个构造函数。因此,上述代码意味着x的值将在每次创建实例时重新初始化。但是由于变量被声明为final(和static),因此您只能这样做 但是,如果删除静态,则可以执行以下操作: 或这个:

  • 问题内容: 在此代码中,我得到一个编译器错误,请参见注释: 有没有一种方法可以使这项工作有效,可以通过其中一个字段从a获取枚举值? 问题答案: 该地图在这里可能是过大的。除非您打算使用四个以上的枚举值,否则可以通过简单地遍历有效字符串并返回正确的字符串来实现getByTracName(String tn)。如果映射键始终是枚举名称,则可以执行以下操作: } 或者您可以执行以下操作: