Java:方法中的枚举参数

时间:2008-09-26 22:55:02

标签: java parameters methods enums

我有一个方法可以说:

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

正如您所注意到的,我有一个名为align的参数。在这个方法里面,我将对if值是'left'还是'right'有一些if条件。将参数设置为String,显然我可以传递任何字符串值..我想知道它是否可能将Enum值作为方法参数,如果是,如何?

以防有人想到这个;我想过使用布尔值,但我真的不喜欢它。首先,如何将真/假与左/右相关联? (好吧,我可以使用注释,但我仍然觉得它很脏)其次,我可能会决定添加一个新值,比如'justify',所以如果我有两个以上的可能值,布尔类型绝对不可能使用。

有什么想法吗?

7 个答案:

答案 0 :(得分:58)

这应该这样做:

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

答案 1 :(得分:20)

对于枚举更酷,你可以使用开关:

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值。

答案 2 :(得分:4)

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

答案 3 :(得分:1)

当然,你可以使用枚举。会有类似以下的工作吗?

enum Alignment {
    LEFT,
    RIGHT
}

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

如果要使用布尔值,可以将align参数重命名为alignLeft。我同意这个实现不是那么干净,但是如果你没有预料到很多变化而且这不是一个公共接口,那么它可能是一个不错的选择。

答案 4 :(得分:1)

你也可以重复使用SwingConstants。{LEFT,RIGHT}。它们不是枚举,但它们确实存在并且在许多地方使用过。

答案 5 :(得分:1)

我不太确定我会使用枚举作为一个完整的类 - 这是一个面向对象的语言,面向对象的最基本原则之一是一个类应该做一件事做得好

一个enum在做一个enum方面做得很好,一个班级作为一个班级做得很好。混合这两个我有一种感觉会让你陷入麻烦 - 例如,你不能将枚举的实例作为参数传递给方法,主要是因为你不能创建枚举的实例。

所以,即使你可能能够enum.process()并不意味着你应该。

答案 6 :(得分:1)

您可以在所述参数中使用枚举,如下所示:

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