写点什么

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:004949
用户头像

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

关注

评论

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

火山引擎DataTester:AB实验平台未来演进趋势是怎样的?

字节跳动数据平台

大数据 AB实验 对比试验 企业号 8 月 PK 榜 数字化增长

产品管理经验分享:删掉 500 个产品待办事项后,我逃离了「假敏捷」

LigaAI

产品经理 敏捷开发 需求管理 产品管理 企业号 8 月 PK 榜

山东布谷科技直播软件源码探索高效、稳定直播传输的技术介绍:流媒体传输技术

山东布谷科技

软件开发 直播 源码搭建 直播软件源码 流媒体技术

鲲鹏助力清华大学夺取SolverChallenge2023竞赛冠军

彭飞

vivo 场景下的 H5无障碍适配实践

vivo互联网技术

前端 H5 移动端适配 无障碍适配 体验提升

向量检索在大模型应用场景的技术和实践

百度Geek说

人工智能 百度 企业号 8 月 PK 榜

用户空间协议栈设计和netmap综合指南

华为云开发者联盟

后端 开发 华为云 华为云开发者联盟 企业号 8 月 PK 榜

实践指南-前端性能提升 270% | 京东云技术团队

京东科技开发者

性能优化 前端 企业号 8 月 PK 榜

cilium 原理之sock_connect

沃趣科技

数据库 云计算 ebpf cilium 沃趣科技

亚马逊云科技助力涂鸦智能出海,家庭能源管理系统(HEMS)将成智能家居新沃土

Lily

2023 Gartner RPA魔力象限报告解读:国产厂商“破纪录”跃升意味着什么?

王吉伟频道

RPA Gartner RPA魔力象限 超自动化 AI大语言模型

在2023年及以后可以改善企业业务的五种软件

高端章鱼哥

项目管理 软件开发 业务管理

springboot+activiti+vue+mysql轻松搞定审批!(源码)

金陵老街

面试官:说说Spring中@NotEmpty、@NotBlank、@NotNull 的区别和使用

java易二三

程序员 架构 计算机

13. Python的文件操作

茶桁

Python 文件操作

汽车及汽车零部件行业云MES解决方案

万界星空科技

解决方案 MES系统 汽车

柏睿数据再度入选Gartner《中国数据库管理系统市场指南》代表厂商

新消费日报

精准测试探索 | 京东云技术团队

京东科技开发者

测试 精准测试 代码覆盖率 企业号 8 月 PK 榜 静态链路

go-zero 是如何实现计数器限流的?

AlwaysBeta

Go 微服务 限流算法 go-zero 限流器

MySQL教学,是不是干货你说的算

java易二三

MySQL 数据库 程序员 计算机 电脑

Vulkan-性能及精细化

江湖修行

android OpenGL ES opengl 渲染 vulkan

从零开始,快速掌握VPS服务器的使用技巧与窍门!

一只扑棱蛾子

VPS VPS服务器

银河麒麟高级操作系统V10助力联通云建设打出组合拳

openEuler

Linux 云原生 操作系统 中间件 openEuler

一篇让小孩都看的懂的ChatGPT原理解析

小宝

大模型 ChatGPT

Programming abstractions in C阅读笔记:p88-p90

codists

[国产化-银河麒麟v10桌面版]FTP适配(FtpClient)

alexgaoyh

Java web 麒麟操作系统 ftp服务 FtpClient commons.net

户外LED显示屏如何设计散热?

Dylan

设计 环境 LED显示屏 户外LED显示屏 led显示屏厂家

火山引擎VeDI助力零售品牌私域运营 实现与会员高效“沟通”

字节跳动数据平台

大数据 云服务 数据平台 火山引擎 企业号 8 月 PK 榜

SpringBoot3文件管理

Java 架构 springboot SpringBoot3

聚焦Web前端安全:最新揭秘漏洞防御方法 | 京东云技术团队

京东科技开发者

WEB安全 漏洞 前端安全 企业号 8 月 PK 榜 XXS

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