是什么使得 java 中的枚举不可实例化?

2024-05-08

我知道一个枚举

enum Year
{
   First, Second, Third, Fourth;
}

被转换成

final class Year extends Enum<Year>
{
        public static final Year First = new Year();
        public static final Year Second = new Year();
        public static final Year Third = new Year();
        public static final Year Fourth = new Year();
}

当我尝试实例化枚举(而不是类)时,我收到编译时错误:

error: enum types may not be instantiated
        Year y = new Year();

据我所知,私有构造函数使类不可实例化。我认为编译器提供了一个私有构造函数。但当看到我们可以使用默认修饰符为枚举定义构造函数但仍然无法创建枚举类型的对象时,我再次感到困惑。

enum Year
{
        First, Second, Third, Fourth;
        Year()
        {
        }
}

class Example
{
        public static void main(String[] args)
        {
                Year y = new Year();
        }
}

我的疑问是,如果它与构造函数无关,那么是什么使得 Java 中的枚举不可实例化?


它被指定在Java语言规范 https://docs.oracle.com/javase/specs/jls/se8/html/index.html:

8.9。枚举类型 https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.9

...

除了由其枚举常量定义的实例之外,枚举类型没有任何实例。尝试显式实例化枚举类型是一个编译时错误(第 15.9.1 节)。

因此compiler确保满足此要求。由于编译器“知道”该类型是enum,它可以区分enum Year and final class Year.

此外,枚举构造函数不允许访问修饰符:

8.9.2.枚举体声明 https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.9

...

如果枚举声明中的构造函数声明是公共的或受保护的,则会出现编译时错误。

...

在枚举声明中,没有访问修饰符的构造函数声明是私有的.

因此,在实践中,enum构造函数看起来像是包范围的(没有访问修饰符),但它确实是私有的。

最后,同一节还指出

在没有构造函数声明的枚举声明中,隐式声明了默认构造函数。默认构造函数是私有的,没有形式参数,也没有 throws 子句。

这使得enum即使没有显式声明构造函数,也是不可实例化的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是什么使得 java 中的枚举不可实例化? 的相关文章

随机推荐

  • Rails 3 中关联的标记装置已损坏

    升级到 Rails 3 后 引用其他标记的装置 用于关系 的装置将停止工作 夹具标签被解释为字符串 而不是查找具有该名称的实际夹具 Example Dog yml sparky name Sparky owner john Person y
  • 通过非 sf 列内连接两个 sf 对象

    我尝试使用内连接或左连接连接两个 sf 数据帧 这些数据框内部都有几何列 我不断收到错误 check join x y 中的错误 y 应该是一个数据框 对于空间连接 请使用 st joinFALSE 下面的可重现示例 df1 lt data
  • jConfirm 警报 - jQuery 插件

    Am jConfirm 用于用户确认 我的第一个 jConfirm 不会因用户操作而停止 而是传递到下一个 My Code function UpdateJobHandler click function var JobHander get
  • 使用cordova打开本地pdf文件

    我使用 cordova 3 3 0 我想打开本地 pdf 文件 然后根据用户需求关闭它 ref window open encodeURI path blank location yes ref addEventListener exit
  • 如何从序列化器字段订购 Django Rest Framework 查询集?

    我如何订购 DjangoQuerySet来自序列化器字段 由于字段太复杂 我无法订购QuerySet using annotate我也无法将值存储在模型中 Edit 串行器 class DrinkListModelSerializer se
  • XSLT,查找最后一个子节点是否是特定元素

    看下面两个例子
  • 带参数的 jQuery Ajax PUT

    看起来使用jQuery Ajax POST会传递参数 但是PUT会 不是 我查看了当前的 jQuery 代码 PUT 和 DELETE 不存在 我查看了 1 4 2 jQuery 其中有 PUT 和 DELETE 使用当前版本的 jQuer
  • android studio 和 android SDK 捆绑的 eclipse 版本有什么区别

    我没有 Android 开发经验 我想开始编写应用程序 The 官方开发者工具页面 http developer android com tools index html包含两个不同 IDE 的链接 第一个包含捆绑的 ADT 版本Eclip
  • 使用 python-shell 持续交换数据

    我需要从节点运行一些 python 脚本 由于我的 python 脚本使用复杂的结构 我认为如果只加载这些结构一次 然后使用这些结构运行一些特定的脚本 任务 会更好 在节点上 我想永远运行一个脚本 或者直到我说它可以终止 并继续向该脚本发送
  • Go 中数组的嵌套结构

    我已经开始使用https mholt github io json to go https mholt github io json to go 将 API JSON 转换为 go 结构 我真的很喜欢它 但是我对如何初始化如下所示的报告定义
  • C# JSON 反序列化:类型是接口或抽象类,无法实例化

    我正在使用这个 C 项目 它使用用于与在线交易平台 Poloniex 进行通信的 API https github com Jojatekok PoloniexApi Net 此代码应该获取钱包中的余额 var x await polo c
  • Bash 完成脚本在某些参数选项后完成文件路径

    我正在为命令行工具编写 bash 完成脚本 plink local cur prev opts COMPREPLY cur COMP WORDS COMP CWORD prev COMP WORDS COMP CWORD 1 opts 1
  • Scala 方法和高级类型参数

    我试图在 scala 中定义一个方法 它采用通用类型S lt Seq Double 并返回一个 S FixedLoad FixedLoad 是一个具体类型 但我的实现给了我错误 我不明白为什么 尽管我多次尝试去理解参数类型和高级类型 但我的
  • 将图像作为 JPanel 的背景

    我是 Java 新手 目前正在创建一个带有图形的游戏 我有这个课程从JFrame 在这个班级里 我有很多JPanel需要图像作为背景 据我所知 为了能够在 JPanel 中绘制图像 我需要一个从 JPanel 扩展的单独的类以及该类的pai
  • 如何将 RTF 文件转换为 pdf 文件?

    如何将 RTF 文件转换为 PDF 文件 我有 adobe PDF 打印机 我应该使用它吗 如果是这样 我如何以编程方式访问它 您可以使用 PDF 打印机 但仍有一些问题需要解决 为了处理跨多个页面的文本 您需要本文 http msdn m
  • MATLAB:比较两个不同长度的数组

    我有两个长度不同的数组 由于采样率不同 需要比较 我想对较大的数组进行下采样以匹配较小的数组的长度 但是该因子不是整数而是小数 举个例子 a 1 1 375 1 75 2 125 2 5 2 875 3 25 b 1 2 3 有什么方法可以
  • 如何在 PHP 中检查特定类型的对象

    我有一种方法 它接受 PDO 对象作为参数 允许用户使用现有连接 而不是打开新连接的方法 并节省资源 public static function databaseConnect pdo null 我知道is object 检查参数是否是一
  • 在多个 for 循环中使用相同的变量名是不好的做法吗?

    我只是使用 JSHint 来检查一些 JavaScript 代码 在代码中 我有两个 for 循环 它们的用法如下 for var i 0 i lt somevalue i 因此两个 for 循环都使用 var i 进行迭代 现在 JSHi
  • 用引号将多行括起来

    我正在尝试构建一个实时模板 其工作方式类似于 评论中的换行 实时模板 将 在每个选定的行之前 例如 选择多行文本 单击Code gt Surround With gt Single quotes 自定义实时模板 和引号将出现在每行周围 例如
  • 是什么使得 java 中的枚举不可实例化?

    我知道一个枚举 enum Year First Second Third Fourth 被转换成 final class Year extends Enum