2016-02-02 1 views
1

Bonne journée!(JAVA Enums) - Classe anonyme à l'intérieur de la constante enum

J'ai une interface qui implémente seulement une seule méthode. Je n'ai pas envie de faire plusieurs classes qui implémentent toutes cette méthode unique donc j'ai décidé d'utiliser des classes anonymes à la place.

J'utilise des énumérations pour certains éléments statiques, ces énumérations ont des instances de mon interface. Cependant, quand j'essaie de faire une classe anonyme dans mes constantes enum, mon IDE (eclipse) ne me dit rien (comme si elle était en dehors d'un bloc de code).

Ma question est la suivante: Puis-je utiliser des classes anonymes dans mes constantes enum?

Si mon texte n'était pas clair (Désolé je ne suis pas en anglais) s'il vous plaît voir l'exemple ci-dessous.

exemple de code

/** 
* My Interface 
*/ 

public interface IPotato { 

    public void eatPotato(); 
} 

/** 
* My enum class 
*/ 
    public enum PotatoEnum { 

     I_WANT_TO_EAT_POTATO(new IPotato() { 
      @Override 
      public void eatPotato() { 
       // Cant put code here. 
      } }); 

     private IPotato _myAnonymousClass; 
     private PotatoEnum(IPotato anonymousClass){ 
      this._myAnonymousClass = anonymousClass; 
     } 

     public IPotato getPotato(){ 
      return _myAnonymousClass; 
     } 

    } 
+0

Oui, cela pourrait fonctionner. Vous pouvez même aller jusqu'à la mise en œuvre de l'interface enum – Ferrybig

+0

Possible duplication de [Singletons, Enums et classes internes anonymes] (http://stackoverflow.com/questions/7599776/singletons-enums-and-anonymous-inner-classes) – SeniorJD

Répondre

2

Vous pouvez le faire, il est tout à fait valable soliton.

Si je peux vous recommander quelque chose, utiliser une solution plus lisible qui sera makeing votre ENUM pour mettre en œuvre votre interface

public enum PotatoEnum implements IPotato{ 

     I_WANT_TO_EAT_POTATO(){ 

      @Override 
      public void eatPotato() { 
       // Cant put code here. 

      }},//more ENUMS ; 

    } 
0

Vous pouvez à cela. La raison de votre erreur est que vous avez deux identifiants publics (enum et interface) dans un seul fichier. retirer du public de ENUM et il travaillera

public interface IPotato { 

public void eatPotato(); 

}

ENUM PotatoEnum {

I_WANT_TO_EAT_POTATO(new IPotato() { 
    @Override 
    public void eatPotato() { 
     // Cant put code here. 
    } 
}); 

private IPotato _myAnonymousClass; 

private PotatoEnum(IPotato anonymousClass) { 
    this._myAnonymousClass = anonymousClass; 
} 

public IPotato getPotato() { 
    return _myAnonymousClass; 
} 

}

0

simplement oui

En faisant cela, vous faites quelque chose comme ça :

I_WANT_TO_EAT_POTATO(An object of a virtual class that implments IPotato class); 

même que:

I_WANT_TO_EAT_POTATO(Passing any parameter defined by constructor); 

Voir Enum constantes en tant que classes internes et vous êtes les faisant passer les paramètres de leurs construcors