【问题标题】:Enum static or non-static method枚举静态或非静态方法
【发布时间】:2013-10-18 09:31:06
【问题描述】:

考虑以下枚举类

public enum ClassA {
    CHECK1("X", 0),
    CHECK2("Y", 2),
    CHECK3("Z", 1);

    private final String id;
    private final String cdValue;

    private ClsA(String id, String cdValue) {
        this.id = id;
        this.cdValue = cdValue;
    }

    private String getId() {
        return id;
    }

    private String getCdValue() {
        return cdValue ;
    }

    private static final List<String> cdValues = new ArrayList<String>();

    static {
        for (ClassA clsA : ClassA.values()) {   
            cdValues.add(clsA.getCdValue());    
        }
    }   

    public boolean isCdValue(String cdValue)
    {
        if clsValues.contains(cdValue)
            return true;
        else return false;
    }   
}

我的问题是isCdValue 方法是否必须是静态的。对于客户端给出的每个输入,我都必须使用此方法isCdValue。因此,方法参数cdValue 会随每个输入而变化。

如果它不能是静态的,那么我想知道如何访问此方法。请注意,我主要对学习非静态方法调用的静态感兴趣。如果它是枚举中的非静态调用,那么我们如何调用这个非静态方法。我并不是要解决如何检查cdValue 是否存在的问题。这只是一个例子。

【问题讨论】:

    标签: java static enums


    【解决方案1】:

    方法 isCdValue 是否必须是静态的。

    是的,方法 isCdValue 在这里必须是静态的。 枚举是一种特殊的类。枚举常量定义枚举类型的一个实例。枚举类型除了由其枚举常量定义的实例外,没有其他实例。因此new 不能用于实例化枚举。

    枚举类型除了由其枚举定义的实例外,没有其他实例 常数。尝试显式地编译是一个编译时错误 实例化一个枚举类型(§15.9.1)。

    参考this

    【讨论】:

      【解决方案2】:

      如果非得把检查方法放在Enum里面,我觉得应该是静态的

      你可以做这个检查:

      ClassA.isCdValue(para)
      

      请注意,您不能 new 枚举对象。因此,如果您的枚举中的方法不是静态的,除非您有实例,否则您无法调用它。但是您的方法的目标是检查字符串是否可以是一个实例。

      另一种可能性是,在您的 Enumm 中使用不可变集合,并将其设为 staticpublic。然后你就可以打电话给ClassA.CD_VALUES.contains(para)

      【讨论】:

      • 我正在学习java,所以我对静态和非静态感到困惑。让我们假设用户输入了 cdValue = 2。我正在使用枚举 ClsA 中的 isCdValue 方法来确定这个 cdValue 是否存在。下一个用户输入了 cdValue =8。我再次使用相同的方法 isCdValue 来检查它是否存在。在第一种情况下,它将返回 true,而在第二种情况下,它将返回 false。方法 isCdValue 必须是静态的还是非静态的。
      • @nonenone 正如我上面回答的那样,如果方法在 Enum 类中,它应该是静态的。否则你不能调用它。您没有 ClassA 的实例。
      • 很抱歉问了同样的问题..我担心的是用户是否会使用枚举中的静态方法 isCdValue 得到正确的结果。在上述情况下,第一个用户应该得到 true 作为结果,而第二个用户应该得到 false。静态我总是与类级别相关联,但搜索输入参数 cdValue 取决于用户的实例。因此,换句话说,如果我连续跑
      • @nonenone 我认为static 方法没有任何问题。如果它在某个地方破坏了您的程序,请举一些具体的例子。那么我们就可以看到问题出在哪里了。
      • 很抱歉问同样的问题..静态我总是与类级别相关联,但搜索输入参数 cdValue 取决于用户的实例。因此,如果我有 public classB{ public String doProcess(String inputCdValue
      【解决方案3】:

      如果您想从ClsA 访问它,则必须将其设为静态,如果您想从ClsSa实例 访问它,则不会。

      其他几件事:首先在哪里声明 clsValues?

      不需要复杂的 if,你可以替换这个:

      public boolean isCdValue(String cdValue)
          {
              if clsValues.contains(cdValue)
                  return true;
              else return false;
          }   
      

      有了这个

      public boolean isCdValue(String cdValue){
          return clsValues.contains(cdValue)
      }   
      

      最后一点,我强烈建议你在所有ifelse 的子句周围加上花括号,我花了很多时间调试,因为有人在 else 下添加了第二行,被愚弄了缩进并认为它只会在 else 上执行。

      【讨论】:

      • 是的,我总是很惊讶我经常看到像这样过时的 if 声明。 “高级”程序员会写类似return condition? true: false; ;^)
      • @Miquel,我认为这不合适,OP 需要获取枚举值并迭代值才能匹配!更合适的是声明静态方法,迭代枚举的所有值并匹配枚举值。
      • @Holger 为什么“高级”需要“真”和“假”?为什么不return condition;
      • @Imagination:这就是我把这个词放在引号里的原因。我没有写高级,而是“高级”。但我仍然在现实生活中的代码中经常看到这种代码模式——即使在 JRE 实现本身中也是如此。
      【解决方案4】:

      你可以使用这样的东西,你不需要static List,但该方法必须是静态的,正如 Kent 回答的那样,

      public static ClassA getClassAByCDValue(String cdValue)
      {
          for(ClassA value: ClassA.values())
          {
              if(value.cdValue.contains(cdValue))
              {
                  return value;
              }
          }
          return null;
      }
      public static boolean isCDValue(String cdValue)
      {
          for(ClassA value: ClassA.values())
          {
              if(value.cdValue.contains(cdValue))
              {
                  return true;
              }
          }
          return false;
      }
      

      使用上面会更合适,因为您只需要注意在枚举中添加/删除项目。

      【讨论】:

        猜你喜欢
        • 2014-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多