5

私はテキストのみのビデオゲームをデザインしています。2 人のキャラクターを一緒に見ることはあまりありませんが、心と気質はよく似ています。

enum私の問題は、 static final 内部定数を使用してコンストラクターを介して定数を初期化する方法がわからないことです。それ以外の場合、ゲームは問題ありません。;)

ここにジレンマがあります:

  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 の前に private static final フィールドを移動するのは違法だと思います。

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

private static final 定数は列挙に対してローカルです。インスタンス定義でそれらをコーディングするだけです。その後、aPreparedQuotePurportedToBeSpontaneousAlmostImpulsive変数から内部的にアクセスできます。

于 2012-09-13T17:41:54.160 に答える
0

You could always do something hacky like this:

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 に答える