Java:Параметр Enum в методе
-
02-07-2019 - |
Вопрос
У меня есть метод, скажем так:
private static String drawCellValue(
int maxCellLength, String cellValue, String align) { }
и, как вы можете заметить, у меня есть параметр под названием align .Внутри этого метода у меня будет некоторое условие if, определяющее, является ли значение "левым" или "правым"..установив параметр в виде строки, очевидно, я могу передать любое строковое значение..Я хотел бы знать, возможно ли использовать значение Enum в качестве параметра метода, и если да, то как?
На всякий случай, если кто-то задумается об этом;Я думал об использовании логического значения, но мне это не очень нравится.Во-первых, как связать true / false с left / right ?(Хорошо, я могу использовать комментарии, но я все равно нахожу это грязным) и, во-вторых, я мог бы решить добавить новое значение, например 'justify', поэтому, если у меня есть более 2 возможных значений, логический тип определенно невозможно использовать.
Есть какие-нибудь идеи?
Решение
Это должно сработать:
private enum Alignment { LEFT, RIGHT };
String drawCellValue (int maxCellLength, String cellValue, Alignment align){
if (align == Alignment.LEFT)
{
//Process it...
}
}
Другие советы
Еще круче с перечислениями, которые вы можете использовать switch:
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);
}
}
Перечисления хороши тем, что результатом исключения будет имя значения enum, а не какое-то произвольное значение int.
Это мне нравится намного больше.уменьшает значение 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...
}
Конечно, вы могли бы использовать перечисление.Сработает ли что-то вроде следующего?
enum Alignment {
LEFT,
RIGHT
}
частная статическая строка drawCellValue(int maxCellLength, Значение ячейки строки, Выравнивание по ширине) { }
Если вы хотите использовать логическое значение, вы могли бы переименовать параметр align во что-то вроде alignLeft .Я согласен, что эта реализация не такая чистая, но если вы не ожидаете больших изменений и это не общедоступный интерфейс, это может быть хорошим выбором.
Вы также можете повторно использовать SwingConstants.{ВЛЕВО, ВПРАВО}.Они не являются перечислениями, но они уже существуют и используются во многих местах.
Я не слишком уверен, что стал бы использовать enum как полноценный класс - это объектно-ориентированный язык, и один из самых основных принципов объектной ориентации заключается в том, что класс должен делать что-то одно, и делать это хорошо.
Перечисление довольно хорошо справляется с ролью перечисления, а класс хорошо справляется с ролью класса.У меня такое чувство, что смешивание этих двух факторов приведет вас к неприятностям - например, вы не можете передать экземпляр enum в качестве параметра методу, в первую очередь потому, что вы не можете создать экземпляр enum.
Таким образом, даже если вы могли бы использовать enum.process() , это не означает, что вы должны это делать.
Вы можете использовать перечисление в указанных параметрах следующим образом:
public enum Alignment { LEFT, RIGHT }
private static String drawCellValue(
int maxCellLength, String cellValue, Alignment align) {}
затем вы можете использовать либо оператор switch, либо оператор if, чтобы действительно что-то сделать с указанным параметром.
switch(align) {
case LEFT: //something
case RIGHT: //something
default: //something
}
if(align == Alignment.RIGHT) { /*code*/}