为什么从主方法访问枚举时为什么会有编译错误?

问题描述 投票:3回答:6

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

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

背景:Java和枚举的新手...

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;

    }
}
java enums
6个回答
6
投票

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

似乎您将Enum定义为另一个类的内部类。如果要执行此操作,则需要使用语法OuterClass.Status进行访问。您公开了它,这样就可以了。您可以毫无问题地从类中访问它,因为它包含在父类的范围内。

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


0
投票

从有限的代码中,我认为问题是您尝试访问

public  Status s;  

从静态方法main中不是静态的

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

从main创建类的实例,并在该实例上使用s或将s声明为static。


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,所以我只在最后添加了它。


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; 

未定义。我建议您添加此枚举或使用您定义的枚举。


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

为我解决。


-2
投票

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

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

这应该可以解决我认为您可能会遇到的错误。

© www.soinside.com 2019 - 2024. All rights reserved.