Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是枚举?_Java - Fatal编程技术网

Java 什么是枚举?

Java 什么是枚举?,java,Java,现在我正试图弄清楚什么是java中的枚举。我知道它们是如何工作的,以及如何/何时使用它们,但我有点不清楚它们到底是什么。根据它们的行为,在我看来,它们只不过是一个带有私有构造函数的类。然而,在我看来,编译器对它们做了一些特殊的处理,因为枚举有一个名为values()的特殊方法,它不会出现在Oracle文档站点上的Enum类中 我的问题是,枚举到底是什么?编译器如何解释它们?一个enum是一个类,它继承了(a)一个private构造函数的类,如您所述;(b)固定的命名,最终实例列表 在封面下,当您

现在我正试图弄清楚什么是java中的枚举。我知道它们是如何工作的,以及如何/何时使用它们,但我有点不清楚它们到底是什么。根据它们的行为,在我看来,它们只不过是一个带有私有构造函数的类。然而,在我看来,编译器对它们做了一些特殊的处理,因为枚举有一个名为
values()
的特殊方法,它不会出现在Oracle文档站点上的Enum类中


我的问题是,枚举到底是什么?编译器如何解释它们?

一个
enum
是一个类,它继承了(a)一个
private
构造函数的类,如您所述;(b)固定的命名,
最终
实例列表

在封面下,当您声明一个
枚举时

public enum Foo {
    A(1) {
        public void bar() {
            System.out.println("A#bar");
        }
    },
    B(2) {
        public void bar() {
            System.out.println("B#bar");
        }
    },
    C(3) {
        public void bar() {
            System.out.println("C#bar");
        }
    };

    private Foo(int x) {
        // Code goes here...
    }

    public abstract void bar();
}
…您可以想象编译器生成如下内容:

public class Foo extends Enum<Foo> {
    public static final Foo A=new Foo(1) {
        public void bar() {
            System.out.println("A#bar");
        }
    };
    public static final Foo B=new Foo(2) {
        public void bar() {
            System.out.println("B#bar");
        }
    };
    public static final Foo C=new Foo(3) {
        public void bar() {
            System.out.println("C#bar");
        }
    };

    private Foo(int x) {
        // Code goes here...
    }
}
公共类Foo扩展了Enum{
公共静态最终Foo A=新Foo(1){
公共空白栏(){
System.out.println(“A#bar”);
}
};
公共静态最终Foo B=新Foo(2){
公共空白栏(){
System.out.println(“B#bar”);
}
};
公共静态最终Foo C=新Foo(3){
公共空白栏(){
System.out.println(“C#bar”);
}
};
私人Foo(int x){
//代码在这里。。。
}
}
还有几件事使
enum
s与众不同:

  • 编译器知道
    enum
    s有一个固定的实例列表。这允许它在
    开关
    没有处理每个值的
    case
    语句时发出警告
  • 每个常量都有一个特殊的、编译器生成的、基于0的、单调递增的密集值。(换句话说,第一个有序号0,第二个有序号1,依此类推。)这允许创建非常高效的基于数组的数据结构

  • 我肯定我遗漏了一些东西,但这是一个很好的起点。

    一个
    enum
    是一个从类继承的类,该类具有(a)一个
    私有
    构造函数,如您所述;(b)固定的命名,
    最终
    实例列表

    在封面下,当您声明一个
    枚举时

    public enum Foo {
        A(1) {
            public void bar() {
                System.out.println("A#bar");
            }
        },
        B(2) {
            public void bar() {
                System.out.println("B#bar");
            }
        },
        C(3) {
            public void bar() {
                System.out.println("C#bar");
            }
        };
    
        private Foo(int x) {
            // Code goes here...
        }
    
        public abstract void bar();
    }
    
    …您可以想象编译器生成如下内容:

    public class Foo extends Enum<Foo> {
        public static final Foo A=new Foo(1) {
            public void bar() {
                System.out.println("A#bar");
            }
        };
        public static final Foo B=new Foo(2) {
            public void bar() {
                System.out.println("B#bar");
            }
        };
        public static final Foo C=new Foo(3) {
            public void bar() {
                System.out.println("C#bar");
            }
        };
    
        private Foo(int x) {
            // Code goes here...
        }
    }
    
    公共类Foo扩展了Enum{
    公共静态最终Foo A=新Foo(1){
    公共空白栏(){
    System.out.println(“A#bar”);
    }
    };
    公共静态最终Foo B=新Foo(2){
    公共空白栏(){
    System.out.println(“B#bar”);
    }
    };
    公共静态最终Foo C=新Foo(3){
    公共空白栏(){
    System.out.println(“C#bar”);
    }
    };
    私人Foo(int x){
    //代码在这里。。。
    }
    }
    
    还有几件事使
    enum
    s与众不同:

  • 编译器知道
    enum
    s有一个固定的实例列表。这允许它在
    开关
    没有处理每个值的
    case
    语句时发出警告
  • 每个常量都有一个特殊的、编译器生成的、基于0的、单调递增的密集值。(换句话说,第一个有序号0,第二个有序号1,依此类推。)这允许创建非常高效的基于数组的数据结构

  • 我肯定我错过了一些东西,但这是一个好的开始。

    阅读。在那之后,带着一个具体的问题回来。你有麻烦过吗?这是一个很好的起点。投票关闭,因为缺乏研究。从上面的链接可以看出:枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量。
    enum
    s:Singleton的用法在文档中。此外,如果
    E
    enum
    类型的名称,则该类型具有以下隐式声明的
    static
    方法:[……]
    public static E[]values();
    […]按声明顺序返回包含此枚举类型常量的数组@白化病Wordfish:阅读文章。它会告诉你一切!习惯于阅读说明书。你已经浪费了太多时间了,读吧。在那之后,带着一个具体的问题回来。你有麻烦过吗?这是一个很好的起点。投票关闭,因为缺乏研究。从上面的链接可以看出:枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量。
    enum
    s:Singleton的用法在文档中。此外,如果
    E
    enum
    类型的名称,则该类型具有以下隐式声明的
    static
    方法:[……]
    public static E[]values();
    […]按声明顺序返回包含此枚举类型常量的数组@白化病Wordfish:阅读文章。它会告诉你一切!习惯于阅读说明书。你已经浪费了这么多时间。默认可见性构造函数也是允许的,尽管我认为这是一个“古怪”的波希米亚怪。是的,我同意,这是一个怪癖。我的意思是,答案很好,我根本不想从中减去,但OP也可以直接阅读@波希米亚人可能会启用懒惰,让您只键入
    Foo(){…}
    ,而不显式指定
    private
    。因为无论如何都不允许调用枚举构造函数,所以它的访问级别并不那么重要,而且它的隐私也会被暗示。(当然,他们也可以这样做,省略访问修饰符相当于枚举的
    private
    ,但这将在某个地方增加一个特殊情况。)也就是说,尽管存在反射和安全性的微妙交互,假设枚举构造函数可以通过反射调用,我现在还不确定。谢谢您的响应。默认值