Вопрос

У меня есть метод, скажем так:

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*/}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top