写点什么

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

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

关注

评论

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

吃透这份“腾讯限量版”Java架构笔记,要个40k不过分吧?

钟奕礼

Java 程序员 java面试 java编程

大厂敲门砖,Github霸榜的顶级并发编程宝典被我搞到手了!

小小怪下士

Java 面试 并发编程 JVM

华为云桌面Workspace,实惠更实用!

科技怪授

华为云桌面

华为云桌面Workspace,随时随地随心的办公新体验

i生活i科技

EasyExcel常用API与注解

陈老老老板

EasyExcel java; 11月月更

华为云会议,让云上办公变得简单高效

科技怪授

华为云会议

手把手教你,从零开始搭建Spring Cloud Alibaba!这份笔记太牛了

钟奕礼

Java java程序员 java面试 java编程

从12K到60K,这2023Java研发必问高级面试题,过关斩将拿offer

钟奕礼

Java java面试 java编程 程序员‘

EasyExcel导出数据超过Excel单表上限解决方案

陈老老老板

EasyExcel java; 11月月更

云原生系列一 【基于CCE Kubernetes编排实战】

叶秋学长

Kubernetes 云原生 CCE 11月月更

云原生系列 二【基于CCE Kubernetes编排实战】

叶秋学长

Kubernetes 云原生 11月月更

糟了,线上服务出现OOM了

小小怪下士

Java 程序员

想你所想,华为云桌面Workspace助你轻松办公

爱尚科技

linux常用服务配置、网络配置 和 基于FTP的上传和下载的几种方式

C++后台开发

Linux linux开发 Linux服务器开发 ftp C++开发

GaussDB拿下的安全认证CC EAL4+究竟有多难

华为云开发者联盟

数据库 后端 华为云

看我如何连夜自建网站背刺我的求职对手们

华为云开发者联盟

云计算 华为云 云服务器 自建网站

面试90%会问到的200+Java面试题汇总(含答案解析)

钟奕礼

Java java程序员 java面试 java编程

好消息 突破:IM开源项目OpenIM采用wasm技术实现jssdk

Geek_1ef48b

SpringBoot整合MongoDB超详细教程

陈老老老板

java; spring-boot 11月月更

The Micro-service design of E-commerce System

David

架构实战营

备战2023春招,P7大佬手打26大后端面试专题神技,1500题解析助力

钟奕礼

Java java程序员 java面试 java编程

双十一优惠持续,华为云会议让沟通简单化

i生活i科技

华为云桌面

10 W字最新 Java 热门面试题及答案总结

钟奕礼

Java java面试 java编程 程序员 java

五年数据库专家,带你深入高性能MySQL架构系统,不来后悔一辈子

钟奕礼

Java java程序员 java面试 java编程

华为云桌面Workspace,让你的办公更加舒适惬意

科技怪授

华为云会议

远程触发Jenkins的Pipeline任务的并发问题处理

程序员欣宸

Java DevOps jenkins 11月月更 pipelien

【Java面经】阿里三面被挂!幸获内推,历经5轮终于拿到口碑offer

钟奕礼

Java java面试 java编程 程序员‘

EasyRecovery15数据恢复软件下载使用安装教程

茶色酒

EasyRecovery15

SpringBoot整合Elasticsearch超详细教程

陈老老老板

ES spring-boot 11月月更

2022最全168道Spring全家桶面试题(含答案)

钟奕礼

Java java面试 java编程 程序员‘

信息论与编码:信道的数学模型

timerring

11月月更 信道 数学模型

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