web-dev-qa-db-fra.com

enum implémentation à l'intérieur de l'interface - Java

J'ai une question sur la mise enum Java enum dans l'interface. Pour le rendre plus clair, veuillez consulter le code suivant:

public interface Thing{
   public enum Number{
       one(1), two(2), three(3);
       private int value;
       private Number(int value) {
            this.value = value;
       }
       public int getValue(){
        return value;
       }
   }

   public Number getNumber();
   public void method2();
   ...
}

Je sais qu'une interface se compose de méthodes avec corps vides. Cependant, l'énumération que j'ai utilisée ici a besoin d'un constructeur et d'une méthode pour obtenir une valeur associée. Dans cet exemple, l'interface proposée ne consistera pas uniquement en méthodes avec des corps vides. Cette implémentation est-elle autorisée?

Je ne sais pas si je dois mettre la classe enum à l'intérieur de l'interface ou la classe qui implémente cette interface.

Si je mets l'énumération dans la classe qui implémente cette interface, la méthode public Number getNumber () doit renvoyer le type d'énumération, ce qui me forcerait à importer l'énumération dans l'interface.

30
Joey

Il est parfaitement légal d'avoir un enum déclaré à l'intérieur d'un interface. Dans votre situation, l'interface est simplement utilisée comme un espace de noms pour l'énumération et rien de plus. L'interface est utilisée normalement partout où vous l'utilisez.

27
Jack

Des exemples pour les choses ci-dessus sont répertoriés ci-dessous:

public interface Currency {

  enum CurrencyType {
    RUPEE,
    DOLLAR,
    POUND
  }

  public void setCurrencyType(Currency.CurrencyType currencyVal);

}


public class Test {

  Currency.CurrencyType currencyTypeVal = null;

  private void doStuff() {
    setCurrencyType(Currency.CurrencyType.RUPEE);
    System.out.println("displaying: " + getCurrencyType().toString());
  }

  public Currency.CurrencyType getCurrencyType() {
    return currencyTypeVal;
  }

  public void setCurrencyType(Currency.CurrencyType currencyTypeValue) {
    currencyTypeVal = currencyTypeValue;
  }

  public static void main(String[] args) {
    Test test = new Test();
    test.doStuff();
  }

}
6
MaheshB

En bref, oui, ça va.

L'interface ne contient aucun corps de méthode; au lieu de cela, il contient ce que vous appelez des "corps vides" et plus communément appelé signatures de méthode.

Peu importe que le enum se trouve à l'intérieur de l'interface.

0
wchargin

Oui, c'est légal. Dans une situation "réelle", Number implémenterait Thing, et Thing aurait probablement une ou plusieurs méthodes vides.

0
user949300