2008-09-26 8 views
25

У меня есть метод позволяет сказать:Java: параметр Enum в методе

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

и, как вы можете заметить, у меня есть параметр, называемый выравнивание. Внутри этого метода у меня будет какое-то условие if на том, является ли значение «левым» или «правильным» .. установка параметра как String, очевидно, я могу передать любое строковое значение. Я хотел бы знать, возможно ли это чтобы иметь значение Enum в качестве параметра метода, и если да, то каким образом?

На всякий случай кто-то думает об этом; Я думал об использовании логического значения, но мне это не очень нравится. Во-первых, как связать true/false с левым/правым? (Хорошо, я могу использовать комментарии, но по-прежнему считаю это грязным), а во-вторых, я могу принять решение добавить новое значение, например «justify», поэтому, если у меня есть более двух возможных значений, тип Boolean определенно невозможен.

Любые идеи?

+4

+1 для не желающих использовать логические выражения и комментарии - спасибо, сэр. – wchargin 2011-08-30 03:59:25

ответ

56

Это следует сделать это:

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

Конечно, вы можете использовать перечисление. Будет что-то вроде следующей работы?

enum Alignment { 
    LEFT, 
    RIGHT 
} 

частный статические строки drawCellValue (интермедиат maxCellLength, String CellValue, выравнивание Alignment) {}

Если вы хотите использовать логическое значение, вы можете переименовать параметр выравнивания на что-то вроде AlignLeft. Я согласен с тем, что эта реализация не такая чистая, но если вы не ожидаете много изменений, и это не открытый интерфейс, это может быть хорошим выбором.

1

Вы также можете использовать SwingConstants. {LEFT, RIGHT}. Они не перечислены, но они уже существуют и используются во многих местах.

19

Даже кулер с перечислений вы можете использовать переключатель:

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

    } 
} 

Перечисления круто, потому что выход за исключением будет имя значения перечисления, а не некоторое произвольное значение внутр.

4

Мне это нравится намного лучше. уменьшает if/switch, просто сделайте.

private enum Alignment { LEFT, RIGHT; 

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

конечно, это может быть:

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

+1 Идея на правильном пути. Однако метод процесса должен быть абстрактным, а LEFT и RIGHT должны обеспечивать его реализацию. – 2009-06-18 16:45:30

1

Я не слишком уверен, что я бы и использовать перечисление в качестве полноценного класса - это объектно-ориентированный язык, и один из самые основные принципы объектной ориентации - это то, что класс должен делать одно и делать это хорошо.

Перечисление делает довольно хорошую работу, превращаясь в перечисление, и класс делает хорошую работу как класс. Смешивание двух я чувствую, что у вас возникнут проблемы - например, вы не можете передать экземпляр enum в качестве параметра для метода, в первую очередь потому, что вы не можете создать экземпляр enum.

Таким образом, даже если вы можете перечислить .process(), это не значит, что вы должны.

1

Вы можете использовать перечисление в указанные параметры, как это:

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

, то вы можете использовать либо переключатель или, если заявление на самом деле сделать что-то с указанным параметром.

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

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