【问题标题】:Java: Enum parameter in methodJava:方法中的枚举参数
【发布时间】:2010-09-13 15:12:30
【问题描述】:

我有一个方法可以说:

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

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

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

有什么想法吗?

【问题讨论】:

  • +1 不想使用布尔值和 cmets - 谢谢你,好先生。

标签: java parameters methods enums


【解决方案1】:

应该这样做:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • +1 这个想法是正确的。但是,process 方法应该是抽象的,LEFT 和 RIGHT 都应该提供它的实现。
      • @ChrisJester-Young 这取决于他们的相似性。如果它们非常相似,则可能的值可能只提供一个私有方法,该方法执行部分实现,process() 负责主要工作并在需要时调用它们。
      • @glglgl 对,这也有效。我只是不想看到像if (this == LEFT) 这样的代码,仅此而已。 :-)
      【解决方案4】:

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

      enum Alignment {
          LEFT,
          RIGHT
      }
      

      private static String drawCellValue(int maxCellLength, String cellValue, Alignment 对齐方式) { }

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:

            您可以像这样在所述参数中使用枚举:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-09-23
              • 2014-03-31
              相关资源
              最近更新 更多