web-dev-qa-db-fra.com

Java: paramètre Enum dans la méthode

J'ai une méthode permet de dire:

private static String drawCellValue(
    int maxCellLength, String cellValue, String align) { }

et comme vous pouvez le constater, j'ai un paramètre appelé align. À l'intérieur de cette méthode, je vais avoir une condition if sur la valeur "gauche" ou "droite" .. définir le paramètre comme chaîne, évidemment je peux passer n'importe quelle valeur de chaîne .. je voudrais savoir si c'est possible d'avoir une valeur Enum comme paramètre de méthode, et si oui, comment?

Juste au cas où quelqu'un y penserait; J'ai pensé à utiliser une valeur booléenne mais je n'en ai pas vraiment envie. Premièrement, comment associer vrai/faux avec gauche/droite? (Ok, je peux utiliser des commentaires mais je le trouve toujours sale) et deuxièmement, je pourrais décider d'ajouter une nouvelle valeur, comme `` justifier '', donc si j'ai plus de 2 valeurs possibles, le type booléen n'est certainement pas possible à utiliser.

Des idées?

28
Jean Paul Galea

Cela devrait le faire:

private enum Alignment { LEFT, RIGHT };    
String drawCellValue (int maxCellLength, String cellValue, Alignment align){
  if (align == Alignment.LEFT)
  {
    //Process it...
  }
}
58
Carra

Encore plus cool avec des énumérations, vous pouvez utiliser le commutateur:

switch (align) {
   case LEFT: { 
      // do stuff
      break;
   }
   case RIGHT: {
      // do stuff
      break;
   }
   default: { //added TOP_RIGHT but forgot about it?
      throw new IllegalArgumentException("Can't yet handle " + align);

   }
}

Les énumérations sont intéressantes car la sortie de l'exception sera le nom de la valeur énumérée, plutôt qu'une valeur int arbitraire.

20
Joshua DeWald

J'aime beaucoup mieux ça. réduit le if/switch, juste faire.

private enum Alignment { LEFT, RIGHT;

void process() {
//Process it...
} 
};    
String drawCellValue (int maxCellLength, String cellValue, Alignment align){
  align.process();
}

bien sûr, cela peut être:

String process(...) {
//Process it...
} 
4
Zamir

Vous pouvez également réutiliser SwingConstants. {LEFT, RIGHT}. Ce ne sont pas des énumérations, mais elles existent déjà et sont utilisées dans de nombreux endroits.

1
Tom

Bien sûr, vous pouvez utiliser une énumération. Souhaitez-vous quelque chose comme le travail suivant?

enum Alignment {
    LEFT,
    RIGHT
}

chaîne statique statique drawCellValue (int maxCellLength, String cellValue, alignement d'alignement) {}

Si vous souhaitez utiliser un booléen, vous pouvez renommer le paramètre align en quelque chose comme alignLeft. Je suis d'accord que cette implémentation n'est pas aussi propre, mais si vous n'anticipez pas beaucoup de changements et que ce n'est pas une interface publique, ce pourrait être un bon choix.

1
Michael Bobick

Vous pouvez utiliser une énumération dans lesdits paramètres comme ceci:

public enum Alignment { LEFT, RIGHT }
private static String drawCellValue(
int maxCellLength, String cellValue, Alignment align) {}

alors vous pouvez utiliser soit un commutateur, soit une instruction if pour réellement faire quelque chose avec ledit paramètre.

switch(align) {
case LEFT: //something
case RIGHT: //something
default: //something
}

if(align == Alignment.RIGHT) { /*code*/}
1
BobbyMacBob

Je ne suis pas trop sûr que j'irais et utiliserais une énumération comme classe à part entière - c'est un langage orienté objet, et l'un des principes les plus fondamentaux de l'orientation objet est qu'une classe devrait faire une chose et bien le faire.

Une énumération fait un très bon travail en tant qu'énumération, et une classe fait un bon travail en tant que classe. En mélangeant les deux, j'ai l'impression que vous aurez des ennuis - par exemple, vous ne pouvez pas passer une instance d'une énumération en tant que paramètre à une méthode, principalement parce que vous ne pouvez pas créer une instance d'une énumération.

Donc, même si vous pourriez être enum.process () ne signifie pas que vous devriez.

1
Rodney P. Barbati