12

考虑以下枚举类

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

4

4 回答 4

9

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

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

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

参考这个

于 2013-10-18T10:11:31.987 回答
4

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

你可以做这个检查:

ClassA.isCdValue(para)

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

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

于 2013-10-18T09:46:12.627 回答
1

如果您想从 访问它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)
}   

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

于 2013-10-18T09:45:52.333 回答
0

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

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

于 2013-10-18T09:58:40.227 回答