2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

Java 枚举增强,提供更强的类型支持

  • 2017-01-12
  • 本文字数:1564 字

    阅读完需:约 5 分钟

最新的 JEP 上显示,Java 枚举将增强泛型支持,并能将方法添加到单个项目上去。这两个功能可以通过一次更改进行交付,原因是它们捆绑在了一起。更改仅仅会影响到 Java 编译器,因此不需要运行时更改。虽然没有目标版本,但可能会在 Java 10 中呈现更改。

一开始这个更改没有得到很大的肯定,比如杰出的 Java Champions Joshua Bloch 就其实用性提出了质疑。然而,通过进一步的讨论和新用例的介绍帮助它逐步获得了支持。

以防你没有看到我对 @BrianGoetz 的回应,我已经看到了 JEP 列出的介绍,我也撤回了我先前对这个变更的不看好观点。用例: https://t.co/O1tJO8oSCp
——Joshua Bloch (@joshbloch) 2016 年 12 月 7 日

让我们一起通过 JEP 中举出的用例和一些其他讨论来总结一下这次变更给开发者带来了什么改变。Java Champion Lukas Eder 提出了一个 StackOverflow 的问题,介绍了通过配置文件、web 会话或类似类型安全的方式检索和设置属性的用例。带有泛型支持的枚举让我们可以指示一组可用的键和它们相关联的类型:

复制代码
public enum Key<T> {
HOST<String>,
PORT<Integer>,
SCORE<Double>
}
public interface PropertiesStore {
public <T> void put(Key<T> key, T value);
public <T> T get(Key<T> key);
}

现在,这些键可以安全地在属性存储中进行检索和存储,因为下面的表达式将无法编译:

复制代码
put(PORT, “not a number”); // error, type mismatch: PORT is Key<Integer>
// “not a number” is String

另一方面,允许单个项目有自己的方法可以帮助定义只适用于某些属性的操作。根据 JEP 301 所述,上述定义可以扩展如下:

复制代码
public enum Key<T> {
HOST<String>,
PORT<Integer>,
SCORE<Double> {
double normalise(double x) {
// score normalisation logic
return result;
}
}
}

根据当前的枚举,所有项目都有通用类型 Key,这意味着方法 normalise 将不可见。但是在这项工作完成后,编译器将会保留这类型信息,这代表着以下的将为真:

复制代码
SCORE.normalise(5.37); // compiles
HOST.normalise(5.37); // error: neither HOST nor Key have normalise

要实现这一点,需要改变计算各个枚举项目的静态类型的方式。正如读者可能知道的一样,枚举在 Java 5 中仅仅作为纯粹的语法上的甜头而添加:JVM 对枚举没有任何特殊的处理,而是由编译器将枚举转换为带有静态对象的普通类,然后将其编译为字节码。抛开一切技术方面的问题,下面的枚举:

复制代码
public enum Colour {
RED, GREEN, BLUE
}

由编译器粗糙地进行了转换,如下(这不是一个非常准确的表达,但是足以解释清楚):

复制代码
public class Colour extends Enum {
public static final Colour RED = new Colour();
public static final Colour GREEN = new Colour();
public static final Colour BLUE = new Colour();
private Colour() {}
}

由于所有项目的类型是 Colour,任何项目特定的方法和类型信息都会丢失。 JEP 301 要做的是确定使用通用枚举类型不足以表示单个项目的情况,在这种情况下生产更多更具体的类型,如Colour$REDColour$GREENColour$BLUE

增强的枚举甚至可以从 JDK 其他部分正在进行的工作中受益。一方面,局部变量类型推断可以让开发人员获得由编译器创建的更清晰的类型,即使这些类型的确切形式在编写代码的时候是未知的,这意味着上面的代码可能是以下这样的:

复制代码
var s = Key.SCORE; // type of s derived as Key$SCORE
s.normalise(8.29); // method normalise can be accessed

另一方面,一些证据和用例都表示枚举中的泛型可能更加广泛地使用于原始类型,这是相当低效的(JVM 必须为每个原始类型使用装盒后对应类型)。这可以通过 Valhalla 项目处理原始类型的泛型这个部分消除障碍,并使其可用于大规模使用。

查看英文原文 Java Enums to Be Enhanced with Sharper Type Support

2017-01-12 18:005396
用户头像

发布了 218 篇内容, 共 78.5 次阅读, 收获喜欢 76 次。

关注

评论

发布
暂无评论
发现更多内容

告别分库分表与停机维护:平凯数据库敏捷模式为制造业ERP注入新活力

TiDB 社区干货传送门

TEM 试用 平凯数据库敏捷模式

还在为分库分表头疼?试试这款国产分布式数据库TiDB,让你的应用“无限”扩容!

TiDB 社区干货传送门

云原生 国产化替代 TiDB 8.x

传帮带 人才梯队建设经验总结(10)

万里无云万里天

人才 工业 工厂运维

记两个 GC 失效修复的案例

TiDB 社区干货传送门

管理与运维 7.x 实践

MySQL撑不住了?这份TiDB替代可行性报告,请收好!

TiDB 社区干货传送门

高可用 技术趋势 MySQL 迁移 TiDB 8.x

SolarWinds Web Help Desk远程代码执行漏洞分析

qife122

网络安全 远程代码执行

从 Oracle 到 TiDB,重构辽宁联通 600 亿数据生产力

TiDB 社区干货传送门

运营商

测试 TiDB 在敏捷模式下的容灾方案

TiDB 社区干货传送门

测试 技术趋势 TEM 试用 平凯数据库敏捷模式

工业管理 团队建设经验总结(4)

万里无云万里天

团队建设 工业 工厂运维

当独立开发者会做内容,才是数字时代的「超级杠杆」

阿星AI工作室

AI 产品经理 自媒体 独立开发 AI工具

如何利用YashanDB提升客户体验与满意度

数据库砖家

平凯数据库敏捷模式的一次体验:开箱即用,简单友好,查询响应速度明显,其良好的扩展能力,更适合应对资源紧张等情况

TiDB 社区干货传送门

平凯数据库敏捷模式

Chromium WebGPU堆缓冲区溢出漏洞CVE-2025-11205安全分析

qife122

网络安全 漏洞分析

使用Silobase在几分钟内快速部署后端API

qife122

数据库 后端开发

Text Workflow for mac(文本格式转换工具)

春天的风暖暖的

TIDB数据库企业版敏捷部署及和mysql性能对比

TiDB 社区干货传送门

7.x 实践 TEM 试用 平凯数据库敏捷模式

Native Instruments Traktor Pro for mac(数字DJ混音器软件)

春天的风暖暖的

Folx GO for Mac:Mac系统的高效下载管理利器

春天的风暖暖的

Bartender 6 for Mac:菜单栏管理的终极解决方案

春天的风暖暖的

Airflow for Mac:高效便捷的跨设备流媒体投屏利器

春天的风暖暖的

初学平凯星辰 TiDB 及敏捷模式的体验

TiDB 社区干货传送门

测试 版本测评 性能测评 平凯数据库敏捷模式

大数据-114 Flink DataStreamAPI 从 SourceFunction 到 RichSourceFunction 源函数的增强与实战

武子康

Java 大数据 flink spark 分布式

超越炒作:使用Agentic AI构建系统架构

qife122

人工智能 Agentic AI

NopGraphQL 的设计创新:从 API 协议到通用信息操作引擎

canonical

graphql Nop平台 什么是 GraphQL 可逆计算,

如何利用YashanDB数据库优化用户数据管理

数据库砖家

Wirecast Pro for Mac:专业级直播与视频制作的全能工具

春天的风暖暖的

平凯数据库敏捷模式体验评测,金融科技行业可参考

TiDB 社区干货传送门

公私合作抗击网络威胁的创新实践

qife122

网络安全 威胁防御

OriginDB番外篇:Java线程安全:从CPU多级缓存说起

shihlei

JMM 线程安全 MESI CPU Cache

Pioneer DJ rekordbox for Mac(专业的DJ音乐管理软件)

春天的风暖暖的

TG Pro for Mac:Mac硬件的智能温度管家

春天的风暖暖的

Java枚举增强,提供更强的类型支持_Java_Abraham Marín Pérez_InfoQ精选文章