5

我正在设计一个纯文本视频游戏,其中有两个不常见的角色,但在内心和性格上却非常相似。

我的问题是我不知道如何enum使用静态最终内部常量通过构造函数初始化常量。否则游戏很好。;)

这是困境:

  1. 枚举常量必须定义在枚举的第一行,如果我没记错的话
  2. 第一行不能引用后面的任何内容(即“在定义之前不能引用字段”)

我该如何解决这个catch-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'!";
}

我正在尝试使用 TYPICAL_QUOTE_FROM_MARIO 初始化 SUPERMARIO,但我还没有定义 TYPICAL_QUOTE_FROM_MARIO。我认为在 SUPERMARIO 之前移动私有静态最终字段是非法的。

4

4 回答 4

8

唯一可行的选择是 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'!";
  }
}
于 2012-09-13T17:40:31.027 回答
6

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

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'!";
}

它比布赖恩的解决方案更简单

于 2014-07-29T14:32:01.853 回答
0

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

于 2012-09-13T17:41:54.160 回答
0

你总是可以做一些像这样的hacky:

public enum Derp
{
    SOMETHING(),
    SOMETHINGELSE();

    private String herp;

    public static final String A = "derp", B = "derp2";

    public String getHerp()
    {
        return herp;
    }

    static
    {
        SOMETHING.herp = A;
        SOMETHINGELSE.herp = B;
    }
}
于 2012-09-13T17:48:59.587 回答