Подтвердить что ты не робот

Java: параметр Enum в методе

У меня есть способ:

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

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

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

Любые идеи?

4b9b3361

Ответ 1

Это должно сделать это:

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

Ответ 2

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

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

   }
}

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

Ответ 3

Мне это нравится намного лучше. уменьшает 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

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

enum Alignment {
    LEFT,
    RIGHT
}

private static String drawCellValue (int maxCellLength, String cellValue, выравнивание выравнивания) {}

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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*/}