2008-09-26 6 views
25

J'ai une méthode permet de dire:Java: paramètre Enum dans la méthode

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

et comme vous pouvez le constater, j'ai un paramètre appelé align. A l'intérieur de cette méthode je vais avoir une condition if si la valeur est 'left' ou 'right' ... en paramétrant le paramètre en String, évidemment je peux passer n'importe quelle valeur de chaîne .. Je voudrais savoir si c'est possible 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'ai pas vraiment envie. Premièrement, comment associer vrai/faux avec gauche/droite? (Ok, je peux utiliser des commentaires mais je les trouve toujours sales) et deuxièmement, je pourrais décider d'ajouter une nouvelle valeur, comme 'justify', donc si j'ai plus de 2 valeurs possibles, le type booléen n'est définitivement pas utilisable.

Des idées?

+4

+1 pour ne pas vouloir utiliser les booléens et les commentaires - merci monsieur. – wchargin

Répondre

56

Cela devrait le faire:

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

Bien sûr, vous pouvez utiliser un ENUM. Quelque chose comme le travail suivant?

enum Alignment { 
    LEFT, 
    RIGHT 
} 

statique private String drawCellValue (int maxCellLength, String CellValue, alignement d'alignement) {}

Si vous voulez utiliser un booléen, vous pouvez renommer le paramètre d'alignement à 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

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.

19

encore plus cool avec énumérations vous pouvez utiliser l'interrupteur:

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); 

    } 
} 

énumérations sont cool parce que la sortie de l'exception sera le nom de la valeur ENUM, plutôt que d'une valeur int arbitraire.

4

J'aime beaucoup mieux. 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, il peut être:

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

+1 L'idée est sur la bonne voie. Cependant, la méthode de processus devrait être abstraite, et LEFT et RIGHT devraient chacun fournir une implémentation de celle-ci. –

+1

@ ChrisJester-Young Cela dépend de leur similitude. Si elles sont assez similaires, les valeurs possibles peuvent seulement fournir une méthode privée qui fait partie de l'implémentation, et 'process()' fait le travail principal et les appelle si nécessaire. – glglgl

+0

@glglgl Bon, ça marche aussi. Je ne veux tout simplement pas voir un code comme 'if (this == LEFT)', c'est tout. :-) –

1

Je ne suis pas sûr que j'irais utiliser un ENUM comme une classe à part entière - c'est un langage orienté objet, et l'un des Les principes les plus fondamentaux de l'orientation des objets sont qu'une classe doit faire une chose et le faire bien.

Enum fait un très bon travail en étant une énumération, et une classe fait un bon travail en tant que classe. Mélanger les deux que j'ai un sentiment vous donnera 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 enum.process() ne veut pas dire que vous devriez.

1

Vous pouvez utiliser un ENUM 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 un commutateur ou si la déclaration de faire quelque chose avec ledit paramètre.

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

if(align == Alignment.RIGHT) { /*code*/} 
Questions connexes