2008-09-26 17 views
25

tengo un método permite decir:Java: Enumeración de parámetros en el método

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

y como se puede notar, que tienen un parámetro llamado align. Dentro de este método voy a tener alguna condición si el valor es 'left' o 'right' ... estableciendo el parámetro como String, obviamente puedo pasar cualquier valor de cadena. Me gustaría saber si es posible. tener un valor Enum como parámetro de método, y si es así, ¿cómo?

En caso de que alguien piense en esto; Pensé en usar un valor booleano, pero realmente no me gusta. Primero, ¿cómo asociar verdadero/falso con izquierda/derecha? (De acuerdo, puedo usar comentarios pero todavía lo encuentro sucio) y en segundo lugar, podría decidir agregar un nuevo valor, como 'justificar', así que si tengo más de 2 valores posibles, definitivamente no es posible usar el tipo booleano.

¿Alguna idea?

+4

+1 por no querer usar booleanos y comentarios - gracias, buen señor. – wchargin

Respuesta

56

Esto debe hacerlo:

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

Claro, usted podría utilizar una enumeración. ¿Algo como el siguiente trabajo?

enum Alignment { 
    LEFT, 
    RIGHT 
} 

privada estática Cadena drawCellValue (int maxCellLength, Cadena CellValue, la alineación de alineación) {}

Si desea utilizar un valor lógico, se puede cambiar el nombre del parámetro align a algo así como AlignLeft. Estoy de acuerdo en que esta implementación no es tan clara, pero si no anticipa muchos cambios y esta no es una interfaz pública, podría ser una buena opción.

1

También podría reutilizar SwingConstants. {LEFT, RIGHT}. No son enumeraciones, pero ya existen y se usan en muchos lugares.

19

Aún más genial con enumeraciones se puede usar el interruptor:

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

    } 
} 

enumeraciones son frescos ya que la salida de la excepción será el nombre del valor de enumeración, en lugar de algún valor entero arbitrario.

4

Me gusta mucho mejor. reduce el interruptor if, simplemente hazlo.

private enum Alignment { LEFT, RIGHT; 

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

por supuesto, puede ser:

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

+1 La idea está en el camino correcto. Sin embargo, el método de proceso debe ser abstracto, e IZQUIERDA y DERECHA cada uno debe proporcionar una implementación del mismo. –

+1

@ ChrisJester-Young Eso depende de su similiaridad. Si son bastante similares, los valores posibles solo pueden proporcionar un método privado que hace una parte de la implementación, y 'process()' hace el trabajo principal y los llama si es necesario. – glglgl

+0

@glglgl Derecha, eso también funciona. Simplemente no quiero ver código como 'if (this == LEFT)', eso es todo. :-) –

1

No estoy muy seguro de que iría a utilizar una enumeración como una clase de pleno derecho - este es un lenguaje orientado a objetos, y una de los principios más básicos de orientación a objetos es que una clase debería hacer una cosa y hacerlo bien.

Un enum está haciendo un muy buen trabajo al ser una enumeración, y una clase está haciendo un buen trabajo como clase. Mezclar los dos que tengo la sensación te meterá en problemas, por ejemplo, no puedes pasar una instancia de una enumeración como parámetro a un método, principalmente porque no puedes crear una instancia de una enumeración.

Por lo tanto, aunque pueda enum.process() no significa que deba hacerlo.

1

Puede utilizar una enumeración de dichos parámetros como este:

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

a continuación, puede utilizar un interruptor o if para hacer realidad algo con dicho parámetro.

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

if(align == Alignment.RIGHT) { /*code*/} 
Cuestiones relacionadas