2008-09-26 64 views
25

我有一个方法枚举参数让说:的Java:在方法

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

,正如你可以看到,我有一个名为对齐参数。在这个方法里面,如果条件是这个值是'left'还是'right',我会得到一些...设置参数为String,显然我可以传递任何字符串值..我想知道是否有可能有一个枚举值作为方法参数,如果是这样,如何?

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

任何想法?

+4

+1不想使用布尔值和注释 - 谢谢你,好的先生。 – wchargin 2011-08-30 03:59:25

回答

56

这应做到:

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

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

enum Alignment { 
    LEFT, 
    RIGHT 
} 

私人静态字符串drawCellValue(INT maxCellLength,字符串cellValue,对齐排列){}

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

1

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

19

即使枚举您可以使用开关冷却器:

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

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

+1这个想法是正确的。但是,过程方法应该是抽象的,并且左和右都应该提供它的实现。 – 2009-06-18 16:45:30

1

我也不太清楚,我会去,并使用一个枚举作为一个完全成熟的阶级 - 这是一个面向对象的语言,和一个面向对象的最基本的原则是,一个班级应该做一件事情并做得好。

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

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

1

您可以使用一个枚举这样说参数:

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