2
votes

Comment créer une classe d'énumérations sans variable d'instance?

J'ai une classe avec une liste d'énumérations, les énumérations sont passées à un constructeur et mises à jour vers toString, mais je ne suis pas autorisé à avoir une variable d'instance sur la classe (une partie de l'exigence). Comment puis-je faire en sorte que les énumérations soient sorties comme la chaîne sans ajouter d'instance?

public enum Other {

    GAME_BOY("Game Boy"), MACBOOK("Macbook Pro"), IPHONE("iPhone XS"), LAPTOP("Laptop");

    private final String product; //can't have instance variable

    private Other(String passed) {
        this.product = passed;
    }

    @Override
    public String toString() {
        return product;
    }
}


1 commentaires

4 Réponses :


5
votes

Vous pouvez remplacer toString() pour chaque élément:

public enum Other {
   GAME_BOY {
     @Override public String toString() { return "Game Boy"; }
   },
   MACBOOK { ... },
   ...
}

Voir ce code exécuté en direct sur IdeOne.com .


1 commentaires

Je pense que cette solution polymorphe est plus précise que d'autres avec une instruction switch (en termes de java en tant que langage POO)



3
votes

Vous pouvez également placer une instruction switch dans la méthode toString:

@Override
public String toString() {
    switch (this) {
        case GAME_BOY:
            return "Game boy";
        case MACBOOK:
            return "Macbook Pro";
        ...
    }
}


1 commentaires

Merci, cela a fonctionné, je ne savais pas que vous pouviez le surpasser comme ça.



2
votes

Que diriez-vous de ce qui suit: -

public enum Other {

    GAME_BOY, MACBOOK, IPHONE, LAPTOP;

  @Override
  public String toString() {

    switch(this) {
      case GAME_BOY:
        return "Game Boy";

      case MACBOOK:
        return "Macbook Pro";

      case IPHONE:
        return "iPhone XS";

      case LAPTOP:
        return "Laptop";

      default:
        return null;
      }
   }

  public static void main(String[] args) {

    System.out.println("The value of the other is " + Other.GAME_BOY.toString());
  }
}


0 commentaires

0
votes

switch amélioré

La réponse acceptée de Williamson fournit un code qui peut être amélioré dans Java 14 et versions ultérieures. L'instruction de commutation améliorée peut empêcher le problème de manquer l'un des objets enum dans votre liste de cas de commutation. Voir: JEP 361: Switch Expressions .

La nouvelle syntaxe est également concise, plus facile à lire.

L'utilisation de la nouvelle approche ressemble à ceci:

    // Example usage.
    public static void main ( String[] args )
    {
        for ( Device device : Device.values() )
        {
            System.out.println( "device = " + device );
        }
    }

Revenez maintenant en arrière et ajoutez un nouveau type d'appareil, tel que WATCH .

                    case WATCH -> "Watch";

Le compilateur marquera votre instruction switch comme incorrecte. Vous verrez un message comme:

l'expression de commutateur ne couvre pas toutes les valeurs d'entrée possibles

Ajoutez le cas supplémentaire dans votre switch , satisfaisant ainsi le compilateur. Ensuite, dormez bien en sachant qu'un vilain bogue a été évité.

    GAME_BOY, MACBOOK, IPHONE, LAPTOP, WATCH;

Exemple d'utilisation:

package work.basil.example;

public enum Device
{
    GAME_BOY, MACBOOK, IPHONE, LAPTOP;

    @Override
    public String toString ( )
    {
        return switch ( this )
                {
                    case GAME_BOY -> "Game boy";
                    case MACBOOK -> "Macbook Pro";
                    case IPHONE -> "iPhone XS";
                    case LAPTOP -> "Laptop";
                };
    }
}


0 commentaires