Java: параметр Enum в методе - PullRequest
27 голосов
/ 27 сентября 2008

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

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

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

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

Есть идеи?

Ответы [ 7 ]

58 голосов
/ 27 сентября 2008

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

private enum Alignment { LEFT, RIGHT };    
String drawCellValue (int maxCellLength, String cellValue, Alignment align){
  if (align == Alignment.LEFT)
  {
    //Process it...
  }
}
20 голосов
/ 28 сентября 2008

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

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.

4 голосов
/ 04 ноября 2008

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

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

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*/}
1 голос
/ 18 февраля 2013

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

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

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

1 голос
/ 27 сентября 2008

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

1 голос
/ 27 сентября 2008

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

enum Alignment {
    LEFT,
    RIGHT
}

частная статическая String drawCellValue (int maxCellLength, String cellValue, выравнивание выравнивания) {}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...