Ответ 1
Это должно сделать это:
private enum Alignment { LEFT, RIGHT };
String drawCellValue (int maxCellLength, String cellValue, Alignment align){
if (align == Alignment.LEFT)
{
//Process it...
}
}
У меня есть способ:
private static String drawCellValue(
int maxCellLength, String cellValue, String align) { }
и, как вы можете заметить, у меня есть параметр, называемый align. Внутри этого метода у меня будет какое-то условие if на том, является ли значение "левым" или "правильным".. установка параметра как String, очевидно, я могу передать любое строковое значение.. Я хотел бы знать, возможно ли это чтобы иметь значение Enum в качестве параметра метода, и если да, то как?
На всякий случай кто-то думает об этом; Я думал об использовании логического значения, но мне это не очень нравится. Во-первых, как связать true/false с левым/правым? (Хорошо, я могу использовать комментарии, но по-прежнему считаю это грязным), а во-вторых, я могу принять решение добавить новое значение, например "justify", поэтому, если у меня есть более двух возможных значений, тип Boolean определенно невозможен.
Любые идеи?
Это должно сделать это:
private enum Alignment { LEFT, RIGHT };
String drawCellValue (int maxCellLength, String cellValue, Alignment align){
if (align == Alignment.LEFT)
{
//Process it...
}
}
Еще кулер с перечислениями вы можете использовать переключатель:
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.
Мне это нравится намного лучше. уменьшает 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
}
private static String drawCellValue (int maxCellLength, String cellValue, выравнивание выравнивания) {}
Если вы хотите использовать логическое значение, вы можете переименовать параметр выравнивания на что-то вроде alignLeft. Я согласен с тем, что эта реализация не такая чистая, но если вы не ожидаете много изменений, и это не открытый интерфейс, это может быть хорошим выбором.
Вы также можете повторно использовать SwingConstants. {LEFT, RIGHT}. Они не перечислены, но они уже существуют и используются во многих местах.
Я не слишком уверен, что поеду и использую 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*/}