枚举静态或非静态方法

时间:2013-10-18 09:31:07

标签: java static enums

考虑以下枚举类

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 个答案:

答案 0 :(得分:6)

  

方法isCdValue必须是静态的。

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

  

枚举类型除了枚举之外没有其他实例   常量。尝试显式是一个编译时错误   实例化枚举类型(§15.9.1)。

参考this

答案 1 :(得分:4)

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

你可以做这个检查:

ClassA.isCdValue(para)

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

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

答案 2 :(得分:1)

如果您想从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的条款中加上花括号,我花了很多调试时间,因为有人在否则,被缩进所欺骗,并认为它只会在其他地方执行。

答案 3 :(得分:0)

你可以使用这样的东西,你不需要static List但是方法必须是静态的,如肯特所回答,

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;
}

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