30

我有一个方法可以说:

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

如您所见,我有一个名为 align 的参数。在此方法中,我将对值是“左”还是“右”有一些 if 条件。将参数设置为字符串,显然我可以传递任何字符串值。我想知道是否有可能将 Enum 值作为方法参数,如果是,如何?

以防万一有人想到这一点;我考虑过使用布尔值,但我并不喜欢它。首先,如何将 true/false 与 left/right 关联?(好吧,我可以使用注释,但我仍然觉得它很脏)其次,我可能会决定添加一个新值,比如 'justify',所以如果我有超过 2 个可能的值,布尔类型肯定是不可能使用的。

有任何想法吗?

4

7 回答 7

60

这应该这样做:

private enum Alignment { LEFT, RIGHT };    
String drawCellValue (int maxCellLength, String cellValue, Alignment align){
  if (align == Alignment.LEFT)
  {
    //Process it...
  }
}
于 2008-09-26T22:59:03.113 回答
21

使用枚举更酷,您可以使用 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 值。

于 2008-09-27T22:00:10.250 回答
5

我更喜欢这个。减少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...
} 
于 2008-11-04T20:00:46.883 回答
1

当然,您可以使用枚举。会像以下工作吗?

enum Alignment {
    LEFT,
    RIGHT
}

私有静态字符串drawCellValue(int maxCellLength,字符串cellValue,对齐对齐){}

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

于 2008-09-26T23:02:05.807 回答
1

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

于 2008-09-27T06:34:56.823 回答
1

我不太确定我会去使用枚举作为一个成熟的类——这是一种面向对象的语言,面向对象的最基本原则之一是一个类应该做一件事并做好。

枚举在成为枚举方面做得很好,而一个类作为一个类做得很好。我有一种感觉,将两者混合起来会给你带来麻烦——例如,你不能将枚举的实例作为参数传递给方法,主要是因为你不能创建枚举的实例。

因此,即使您可能能够 enum.process() 并不意味着您应该这样做。

于 2013-02-18T06:49:53.777 回答
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*/}
于 2017-01-17T19:27:34.777 回答