Java:方法中的枚举参数

hhic 发布于 2018-05-09 enums 最后更新 2018-05-09 08:18 225 浏览

我有一个方法让我们说:

private static String drawCellValue(
    int maxCellLength, String cellValue, String align) { }
正如你可以注意到的,我有一个名为align的参数。在这个方法里面,如果条件是这个值是'left'还是'right',我会得到一些...设置参数为String,显然我可以传递任何字符串值..我想知道是否有可能有一个枚举值作为方法参数,如果有,如何? 以防万一有人想到这点;我想过使用布尔值,但我并不喜欢它。首先,如何将真/假与左/右相关联? (好吧,我可以使用评论,但我仍然觉得它很脏),其次,我可能会决定添加一个新的值,如'justify',所以如果我有超过2个可能的值,布尔类型绝对不可能使用。 有任何想法吗?
已邀请:

xhic

赞同来自:

这应该做到这一点:

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

nquis

赞同来自:

当然,你可以使用枚举。会像下面的工作?

enum Alignment {
    LEFT,
    RIGHT
}
private static String drawCellValue(int maxCellLength,String cellValue,Alignment alignment){} 如果你想使用布尔值,你可以将align参数重命名为像alignLeft。我同意这个实现不是很干净,但是如果你没有预料到很多变化,这不是一个公共接口,它可能是一个不错的选择。

pporro

赞同来自:

您也可以重复使用SwingConstants。{LEFT,RIGHT}。它们不是枚举,但它们已经存在并在许多地方使用。

oalias

赞同来自:

使用枚举更酷,可以使用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);
}
}
枚举很酷,因为异常的输出将是枚举值的名称,而不是一些任意的int值。

iaut

赞同来自:

我更喜欢这个。 减少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...
} 

wearum

赞同来自:

我不太确定我会去使用枚举作为一个完整的类 - 这是一种面向对象的语言,而面向对象的最基本的原则之一是一个类应该做一件事并做得好。 一个枚举在做一个枚举方面做得非常好,一个班级作为一个班级做得很好。混合两者我有一种感觉会让你陷入麻烦 - 例如,你不能将一个枚举实例作为参数传递给一个方法,主要是因为你不能创建一个枚举实例。 所以,即使你可能能够enum.process()并不意味着你应该。

mest

赞同来自:

你可以在这样的参数中使用枚举:

public enum Alignment { LEFT, RIGHT }
private static String drawCellValue(
int maxCellLength, String cellValue, Alignment align) {}
那么你可以使用开关或if语句实际上对所述参数进行操作。
switch(align) {
case LEFT: //something
case RIGHT: //something
default: //something
}
if(align == Alignment.RIGHT) { /*code*/}