web-dev-qa-db-fra.com

Pourquoi ne puis-je pas créer une énumération dans une classe interne en Java?

Ce que j'essaie de faire, c'est ceci:

public class History {
    public class State {
        public enum StateType {

Eclipse me donne cette erreur de compilation sur StateType: The member enum StateType must be defined inside a static member type.

L'erreur disparaît lorsque je rend la classe State statique. Je pourrais rendre State statique, mais je ne comprends pas pourquoi je ne peux pas déclarer un enum dans une classe interne.

54
Steven Roose

enum les types définis comme types imbriqués sont toujours implicitement static (voir JLS §8.9. Enums )

Vous ne pouvez pas avoir un type imbriqué statique à l'intérieur d'un type non statique (alias une "classe interne", voir JLS §8.1.3. Classes internes et instances de clôture ).

Par conséquent, vous ne pouvez pas avoir un type interne enum à l'intérieur d'un type imbriqué non statique.

87
Joachim Sauer

Si vous avez déclaré une énumération comme celle-ci:

enum Suit {SPADES, HEARTS, CLUBS, DIAMONDS}

Le compilateur Java générerait synthétiquement la classe suivante pour vous:

final class Suit extends Java.lang.Enum<Suit> {
  public static final Suit SPADES;
  public static final Suit HEARTS;
  public static final Suit CLUBS;
  public static final Suit DIAMONDS;
  private static final Suit[] $VALUES;
  public static Suit[] values();
  public static Suit valueOf(Java.lang.String);
  private Suit();
}

Il n'y a aucune intention de créer d'autres instances de cette classe autres que les champs statiques déjà définis dans celle-ci (comme vous pouvez le déduire de son constructeur privé), mais plus important encore, et comme mentionné dans la réponse acceptée, une classe interne ne peut pas avoir de membres statiques ( JLS §8.1.3. Classes internes et instances de clôture ), et puisque la classe synthétique enum le fait, elle la rend inacceptable en tant que classe interne.

12
Edwin Dalorzo

Déjà suffisamment d'informations de + Joachim Sauer, j'ajoute juste quelques détails supplémentaires.

Vous ne pouvez définir une énumération interne que si votre classe interne est une classe interne imbriquée statique. Voir ci-dessous

private static class DbResource {

    public enum DB {
        MERGE_FROM, MERGE_TO, MAIN;
    }
}
5
Dhiral Pandya

Cela a fonctionné pour mon cas d'utilisation:

public class History {

    public interface HConstants{
         public enum StateType { PAST,CURRENT,FUTURE}
    }

    //Inner class
    public class State implements HConstants{
        public StateType stateField = StateType.PAST;
1
K F