枚举静态或非静态方法

non*_*one 7 java enums static

考虑以下枚举类

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;
    }   
}
Run Code Online (Sandbox Code Playgroud)

我的问题是该方法isCdValue必须是静态的.我必须对isCdValue客户端给出的每个输入使用此方法.因此,方法参数cdValue会针对每个输入进行更改

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

Rit*_*une 6

方法isCdValue必须是静态的.

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

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

请参阅


Ken*_*ent 5

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

你可以做这个检查:

ClassA.isCdValue(para)
Run Code Online (Sandbox Code Playgroud)

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

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


Miq*_*uel 1

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

其他一些事情:您首先在哪里声明 clsValues?

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

public boolean isCdValue(String cdValue)
    {
        if clsValues.contains(cdValue)
            return true;
        else return false;
    }   
Run Code Online (Sandbox Code Playgroud)

有了这个

public boolean isCdValue(String cdValue){
    return clsValues.contains(cdValue)
}   
Run Code Online (Sandbox Code Playgroud)

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