AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

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

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

关注

评论

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

解读场景化视频制作工具的实现过程

阿里云CloudImagine

云计算 智能生产

阿里云云原生每月动态 | 聚焦实战,面向开发者的系列课程全新上线

阿里巴巴云原生

阿里云 云原生

Spring中Autowired注解到底怎么实现的

做梦都在改BUG

Java spring 框架

龙蜥LoongArch架构研发全揭秘,龙芯开辟龙腾计划技术合作新范式

OpenAnolis小助手

操作系统 龙蜥社区 龙腾计划 龙芯中科 LoongArch

我的sql没问题为什么还是这么慢|MySQL加锁规则

做梦都在改BUG

Java MySQL 数据库

【技术干货】第1篇:有道实况OCR技术

有道技术团队

一文吃透 Go 内置 RPC 原理

捉虫大师

Go RPC

在云原生和裸金属环境开展NFS存储性能比对测试

QE_LAB

云原生 性能测试

2022 IoTDB Summit:国网信通谢可《Apache IoTDB 在国家电网的应用案例》

Apache IoTDB

数据库·

借助阿里云 AHPA,苏打智能轻松实现降本增效

阿里巴巴云原生

阿里云 容器 云原生 AHPA

2022 IoTDB Summit:中国工程院院士倪光南《发展开源教育,汇天下英才激活中国创新动能》

Apache IoTDB

数据库· ;开源

安全高效 | AIRIOT智慧工地管理解决方案

AIRIOT

物联网 智慧工地

探究计算机视觉新兴能力:如何通过提示检索提高性能?

Zilliz

计算机视觉

鲁班软件使用明道云优化项目管理的全过程

明道云

玩好 StarRocks,大厂 offer 接不完!|字节跳动、小红书、京东物流、唯品会、腾讯音乐要的就是你!

StarRocks

数据库

解锁智能合约的力量:区块链入门教程

领创集团Advance Intelligence Group

区块链 智能合约 以太坊

运维训练营第16周作业

好吃不贵

OpenCloudOS 如何以最小成本,高效定位内存泄露路径?

OpenCloudOS

Linux 内存 opencloudOS

跨境数据传输是日常业务中经常且至关重要的组成部分

镭速

前端已死?我看未必,但「低代码」已剑指前端程序员

引迈信息

面试 Vue 前端 低代码

从智能进化模型看用友BIP的AI平台化能力

YonBuilder低代码开发平台

深度访谈 Vland CTO:像乐高一样搭建元宇宙

万事ONES

元宇宙 访谈

再次飙升GitHub榜首!这份“保姆级”的SpringBoot笔记,不服不行

做梦都在改BUG

Java spring 微服务 Spring Boot 框架

2022 IoTDB Summit:Dr.Feinauer《Apache IoTDB 在德国汽车生产线多级数据同步中的应用实践》

Apache IoTDB

数据库·

请你喝一杯 Corretto?谈一谈 JDK 的新选择

亚马逊云科技 (Amazon Web Services)

Java jdk

3.基于Label studio的训练数据标注指南:文本分类任务

汀丶人工智能

信息抽取 数据标注 文本分类 labelstudio

一文读懂PaddleSpeech中英混合语音识别技术

飞桨PaddlePaddle

语音识别 百度飞桨

《数据治理行业实践白皮书》正式发布,开辟数据治理新范式(附下载)

袋鼠云数栈

数据治理

听说你没法在 JRE 中使用 arthas?不,你可以

阿里巴巴云原生

Java 阿里云 容器 云原生

最佳实践 | 基于腾讯云MRCP-Server打造简单智能外呼系统

牵着蜗牛去散步

人工智能 腾讯云 腾讯 语音识别 智能外呼系统

GitLab 专家分享|关于 DevSecOps ,你需要知道这几点

极狐GitLab

DevOps DevSecOps 极狐GitLab 研发运维 安全左移

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