枚举静态或非静态方法



考虑以下枚举类

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是否存在的问题。这只是一个例子。

方法是否必须是静态的。

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

枚举

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

参考这个

如果你必须把检查方法放在枚举中,我认为它应该是静态的

您可以执行以下检查:

ClassA.isCdValue(para)

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

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

如果你想

ClsA 访问它,你必须让它成为静态的,如果你想从ClsSa的实例访问它,那么它就没有。

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

如果,

您可以替换它,则不需要复杂的:

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 上执行。

你可以

使用这样的东西,你不需要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;
}

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

最新更新