从main方法访问Enum时为什么会出现编译错误?

时间:2012-01-12 15:04:50

标签: java enums

所以我有点困惑,因为我从未使用过enum。我想在我的main方法中使用这个枚举。出于某种原因,我不能(我甚至在我主要尝试Status s;时随时都会收到错误)。然而,我可以从main调用我的TestingEnum方法,当然这可行...但我100%确定以这种方式使用枚举是完全错误的。有人可以告诉我,我是如何正确使用它的吗?

如果我尝试这样做:状态s;在我的主要方法中,我收到此错误 - "找不到符号状态s;"

背景:java和enums的新手......

class MyClass {
    public Status s;

    public enum Status {
        STATUS_OPEN(1), 
        STATUS_STARTED(2), 
        STATUS_INPROGRESS(3), 
        STATUS_ONHOLD(4), 
        STATUS_COMPLETED(5), 
        STATUS_CLOSED(6);

        private final int status;

        Status(int stat) {
            this.status = stat;
        }

        public int getStatus() {
            return this.status;
        }

    }

    private void setStatus(Status stat) {
        s = stat;
    }

    public void TestingEnum() {
        Status myStat = Status.STATUS_ONHOLD;
        setStatus(myStat);
    }

    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();
        String NEW_LINE = System.getProperty("line.separator");

        result.append(NEW_LINE + " Status: " + s + NEW_LINE);

        return result.toString();
    }
}  

public class Main {
    public static void main(String[] args) {
        MyClass obj = new MyClass();

        // PROBLEM SETTING STATUS HERE
        // I can't do this:
        Status s;

    }
}

6 个答案:

答案 0 :(得分:6)

将枚​​举移动到自己的类文件中,或者通过引用封闭类来访问它。

看起来你将Enum定义为另一个类的内部类。如果您正在执行此操作,则需要使用语法OuterClass.Status访问它才能访问它。你把它公开了,这样才行。你可以在课堂上访问它,没有任何问题,因为它包含在父类的范围内。

因此,您可以在OuterClass.之前添加Status,也可以像其他任何类一样将Enum移动到自己的文件中。

答案 1 :(得分:0)

从有限的代码我认为问题是你试图访问

public  Status s;  

这不是静态方法main

的静态
public static void main(String[] args) {
...
}

从main创建一个类的实例,并在该实例上使用方法使用s或将s声明为静态。

答案 2 :(得分:0)

根据您的修改。您遇到的问题是该类的名称是嵌套的,并称为MyClass.Status

尝试

public static void main(String[] args) {
    MyClass obj = new MyClass(); 

   //PROBLEM SETTING STATUS HERE
   //I can't do this:
   MyClass.Status s = MyClass.Status.STATUS_OPEN; 
}

BTW:你的IDE应该能够自动修复这个错误。


我看到的唯一编译错误是您使用了

Status myStat = Status.ABANDONED; 

没有定义它。我建议你添加这个枚举或使用你定义的。

答案 3 :(得分:0)

你不能只是在像这样的公共类之前实例化一个枚举。解决问题的一种方法是使用一个外部类,将您的Enum类作为内部类,如下所示:

public class MyStatus {
    static enum Status { 
        STATUS_OPEN(1),  
        STATUS_STARTED(2),  
        STATUS_INPROGRESS(3),  
        STATUS_ONHOLD(4),  
        STATUS_COMPLETED(5),  
        STATUS_CLOSED(6),
        ABANDONED(7);
        private final int status;
        Status(int stat) { 
            this.status = stat;
        }
        public int getStatus() { 
            return this.status; 
        } 
    }
    private Status s;
    public void setStatus(Status stat) {
        s = stat; 
    }
    public void TestingEnum() {
        Status myStat = Status.ABANDONED; 
        setStatus(myStat); 
    }
    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();
        String NEW_LINE = System.getProperty("line.separator");
        result.append(NEW_LINE + " Status: " + s + NEW_LINE);
        return result.toString();
    }
}

ABANDONED也未定义,所以我最后添加了它。

答案 4 :(得分:0)

我通过在类外部创建一个非静态枚举来解决此错误。

public enum Status { 
        STATUS_OPEN(1),  
        STATUS_STARTED(2),  
        STATUS_INPROGRESS(3),  
        STATUS_ONHOLD(4),  
        STATUS_COMPLETED(5),  
        STATUS_CLOSED(6),
        ABANDONED(7);
        private final int status;
        Status(int stat) { 
            this.status = stat;
        }
        public int getStatus() { 
            return this.status; 
        } 
    }

创建的MyStatus类没有内部枚举块:

public class MyStatus {
    private Status s;
    public void setStatus(Status stat) {
        s = stat; 
    }
    public void TestingEnum() {
        Status myStat = Status.ABANDONED; 
        setStatus(myStat); 
    }
    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();
        String NEW_LINE = System.getProperty("line.separator");
        result.append(NEW_LINE + " Status: " + s + NEW_LINE);
        return result.toString();
    }
}

为我解决。

答案 5 :(得分:-2)

您无法在main()中引用状态,因为状态为public时,它不是static。您需要创建封闭类的实例,然后使用它来创建枚举实例:

MyEnclosingClass clz = new MyEnclosingClass();
Status status = clz.new Status();

这应该可以解决我相信你可能会遇到的错误。