web-dev-qa-db-ja.com

ネストされたJava列挙型の定義-静的として宣言すると違いが生じますか?

私はインターフェースを持っています-ここに例としてうまく作られたバージョンがあります:

public interface Particle {

    enum Charge {
        POSITIVE, NEGATIVE
    }

    Charge getCharge();

    double getMass();

    etc...
}

Charge列挙型を静的として定義した場合、これの実装がどのように動作するかに違いはありますか?つまり、これは効果がありますか?

public interface Particle {

    static enum Charge {
        POSITIVE, NEGATIVE
    }

    Charge getCharge();

    double getMass();

    etc...
}
54
serg10

いいえ、違いはありません。ただし、理由は、Jonが言うように、インターフェース内のメンバー宣言だからではありません。本当の理由は、言語仕様(8.9)によると、

ネストされた列挙型は暗黙的に静的です。ネストされた列挙型を静的であると明示的に宣言することは許容されます。

次の例では、staticでも違いはありません(インターフェイスがない場合でも)。

public class A {
  enum E {A,B};
}

public class A {
  static enum E {A,B};
}

ネストされたprivate enumを使用した別の例(暗黙的にパブリックではない)。

public class A {
  private static enum E {A,B}
}
86
idrosid

いいえ、違いはありません。 言語仕様、セクション9.5 から:

インターフェイスには、メンバー型宣言( §8.5 )を含めることができます。インターフェースのメンバー型宣言は、暗黙的にstaticおよびpublicです。

31
Jon Skeet