2008-09-26 31 views
25

Mam metoda pozwala powiedzieć:Java: Parametr Enum w metodzie

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

i jak można zauważyć, mam parametr nazywane wyrównać. Wewnątrz tej metody będę mieć pewne warunku, czy wartość jest "lewo" lub "prawo" .. ustawienie parametru jako ciąg, oczywiście mogę przekazać dowolną wartość ciągu .. Chciałbym wiedzieć, czy to możliwe mieć wartość wyliczenia jako parametr metody, a jeśli tak, to w jaki sposób?

Na wszelki wypadek, gdy ktoś o tym pomyśli; Myślałem o używaniu wartości Boolean, ale nie bardzo mi się to podoba. Po pierwsze, jak powiązać wartość true/false z lewą/prawą stroną? (OK, mogę używać komentarzy, ale nadal uważam, że jest brudny), a po drugie, mogę zdecydować się na dodanie nowej wartości, np. "Justify", więc jeśli mam więcej niż 2 możliwe wartości, typ Boolean zdecydowanie nie jest możliwy do użycia.

Wszelkie pomysły?

+4

+1 za brak chęci użycia booleans i komentarzy - dziękuję, dobry panie. – wchargin

Odpowiedz

56

ten powinien zrobić:

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

Oczywiście, można użyć enum. Czy coś podobnego do tej pracy?

enum Alignment { 
    LEFT, 
    RIGHT 
} 

private static String drawCellValue (int maxCellLength, String cellValue, wyrównanie Wyrównanie) {}

Jeśli chcesz użyć logiczną, można zmienić nazwę parametru align coś podobnego alignLeft. Zgadzam się, że ta implementacja nie jest tak czysta, ale jeśli nie przewidujesz wielu zmian i nie jest to publiczny interfejs, może to być dobry wybór.

1

Można również ponownie użyć SwingConstants. {LEWO, PRAWO}. Nie są one wyliczeniem, ale już istnieją i są używane w wielu miejscach.

19

Nawet chłodnica z teksty stałe można użyć przełącznika:

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

    } 
} 

wyliczenia są fajne, ponieważ wyjście z wyjątkiem będzie nazwa wartości enum, raczej niż niektóre arbitralna wartość int.

4

Podoba mi się to o wiele lepiej. redukuje if/switch, po prostu rób.

private enum Alignment { LEFT, RIGHT; 

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

oczywiście może być:

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

+1 Pomysł jest na dobrej drodze. Jednak metoda procesu powinna być abstrakcyjna, a LEWA i PRAWA powinny zapewniać jej implementację. –

+1

@ ChrisJester-Young To zależy od ich podobieństwa. Jeśli są one podobne, możliwe wartości mogą zapewnić tylko prywatną metodę, która jest częścią implementacji, a 'process()' wykonuje główną pracę i wywołuje je, jeśli jest to wymagane. – glglgl

+0

@glglgl Dobrze, to też działa. Po prostu nie chcę widzieć kodu takiego jak 'if (this == LEFT)', to wszystko. :-) –

1

Nie jestem też pewien, że pójdę i użyć enum jako pełnej klasie rozwiniętego - jest językiem obiektowym, a jeden z najbardziej podstawową zasadą orientacji obiektowej jest to, że klasa powinna zrobić jedną rzecz i zrobić to dobrze.

Osoba wyznająca robi niezłą robotę będąc wyliczanką, a klasa robi dobrą robotę jako klasa. Miksowanie tych dwóch mam wrażenie, że wpadniesz w kłopoty - na przykład nie możesz przekazać instancji wyliczenia jako parametru metody, głównie dlatego, że nie możesz utworzyć instancji wyliczenia.

Tak więc, mimo że możesz być w stanie enum.process(), nie oznacza to, że powinieneś.

1

Można użyć enum we wspomnianej parametry takie jak ten:

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

następnie można użyć przełącznika lub if faktycznie zrobić coś z tego parametru.

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

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