1
public enum Batman
{
    Rat, Cat, Bat;

    private boolean isMatch;

    // Constructor
    Batman()
    {
        this.isMatch =  (this.compareTo(Bat) == 0) ? true : false;
    }

    public boolean isMatch()
    {
        return this.isMatch;
    }
}

コンストラクタ行については、次のエラーが表示されます: 初期化子内の静的列挙フィールド Batman.Bat を参照できません

私は主に、コンストラクターで特定の ENUM を識別できるかどうかを把握しようとしています。
また、「isMatch」値を保存することを考えている理由は、それがどうあるべきかを毎回評価したくないからです。私は最初から知っているので、値を保存したいだけなので、呼び出しが行われたときは評価ではなく、単に値を返すだけです

これを解決する他の方法があることは知っています:

  1. パラメーターを受け入れるようにコンストラクターを変更します。

    ネズミ(偽)、猫(偽)、コウモリ(真);

    // Constructor
    Batman(boolean isMatch)
    {
        this.isMatch = isMatch;
    }
    
  2. isMatch() を変更

public boolean isMatch()
  {
      return (this.compareTo(Bat) == 0) ? true : false;
  }

どんなアドバイスも素晴らしいでしょう。

ありがとう

4

3 に答える 3

3

他の人が言ったように、コンストラクターで特定の Enum 値を参照することはできません。明らかな解決策は、次のように書くことです。

public enum Batman
{
    Rat, Cat, Bat;


    public boolean isMatch()
    {
        return this == Bat;
    }
}

(ところで、Enumと等しい必要はありません)

しかし、評価this == Batが本当に気になる場合は、Bat の isMatch をオーバーライドできます。

public enum Batman
{
    Rat, Cat,
    Bat {
        @Override
        public boolean isMatch() {
            return true;
        }
    };

    public boolean isMatch()
    {
        return false;
    }
}

このように、比較はありません。代わりに、列挙値によってオーバーライドされたメソッドを使用します。

そして、楽しみのためだけに、これのバリエーション:

public enum Batman
{
    Rat, Cat,
    Bat {{
            this.isMatch = true;
        }};

    protected boolean isMatch = false;

    public boolean isMatch()
    {
        return isMatch;
    }
}

( Bat インスタンスがアクセスできるように、プライベートではなく保護する必要があるという表記{{ }}と事実に注意してください。)isMatch

于 2013-02-15T14:55:44.020 に答える
2

本有効なJavaから:

列挙型コンストラクターは、コンパイル時の定数フィールドを除いて、列挙型の静的フィールドにアクセスできません。これらの静的フィールドは、コンストラクターの実行時にまだ初期化されていないため、この制限が必要です。

于 2013-02-15T14:52:12.127 に答える
1

コンストラクターで特定の ENUM を参照することは絶対にできません。参照したいときに作成する必要があり、作成しているだけだからです!
列挙型自体の内部実装の外部に依存する特定の知識を作成するため、オプション1を使用します。

于 2013-02-15T14:48:01.423 に答える