案例分享:阿里巴巴全球化电商核心系统架构实战,点击学习>>> 了解详情
写点什么

Java Nestmate 稳步推进

2018 年 3 月 21 日

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

Oracle 提出了 JEP 181“基于嵌套的访问控制”,即“Nestmate”。该 JEP 将是对 Java 平台的一次技术提升,可偿清 20 年前 Java 1.1 中存在的技术债务。

新特性与 Java 的嵌套类息息相关,嵌套类也时常被不严格地称为“内部类”,因为内部类是嵌套类的唯一可能类型。

一般来说,嵌套类型具有独立的两类用途,它们都与封装有关。

第一类用例是,嵌套类只可能在非常特定的原因下、在非常小范围的代码中需要。这意味着,嵌套类的确是实现细节的一部分,需要以紧密本地化的方式实现。

在旧版本的 Java 中,实现此用途的唯一方式是使用嵌套类型,例如使用内部类匿名实现接口。在实践中,随着 Java 8 的推出,该用例已经完全被使用 lambda 表达式和匿名类型所替代。虽然在一些情况下,依然使用近乎本地化类型,但是这类使用情况已经大幅度减少。

此外,类型可能是嵌套的。因为在一些情况下,一个类型需要具有对另一个类型内部的完全访问。这时该类型可实现为嵌套类型(即成员),就可以如同变量和方法那样,使用同样的方式实现访问。这意味着,嵌套类型具有访问特权,它可以认为是一种“对封装原则的略为放宽”。

另一类用例是,嵌套类型需要在某种程度上与其它类型绑定。这意味着,嵌套类型并不需要作为一个真正的实体,完全独立的存在,只是与其它的类型共存。

Nestmate JEP 的目的就是推广并形式化这种类型间的共生关系,进而厘清当前的实现。而当前的实现是一些技术债务,以现在的眼光看是相当黑科技的。

在 Java 10 中,嵌套类将编译为独立的顶层类文件,只是具有特殊的命名转换。例如,在Outer类内定义的嵌套类Nested,将被编译成一个名为Outer$Nested.class的文件。

实现该策略的问题在于,根据 Java 语言的规则,嵌套类具有访问其封闭类内的所有成员的权限,其中包括私有成员。

为解决该问题,javac将在Outer类中额外添加了允许访问的合成访问器(synthetic accessor)方法。举例说明,下面的代码定义了一个基本的内部类:

复制代码
public class Outer {
private int i = 0;
public class Inner {
public int i() {
return i;
}
}
}

编译该类,将生成两个类文件Outer.classOuter$Inner.class,字节码分别为:

复制代码
public class Outer {
private int i;
public Outer();
Code:
0: aload_0
1: invokespecial #2 // 方法 java/lang/Object."<init>":()V
4: aload_0
5: iconst_0
6: putfield #1 // 域 i:I
9: return
static int access$000(Outer);
Code:
0: aload_0
1: getfield #1 // 域 i:I
4: ireturn
}
</init>

复制代码
public class Outer$Inner {
final Outer this$0;
public Outer$Inner(Outer);
Code:
0: aload_0
1: aload_1
2: putfield #1 // 域 this$0:LOuter;
5: aload_0
6: invokespecial #2 // 方法 java/lang/Object."<init>":()V
9: return
public int i();
Code:
0: aload_0
1: getfield #1 // 域 this$0:LOuter;
4: invokestatic #3 // 方法 Outer.access$000:(LOuter;)I
7: ireturn
}
</init>

编译器将inner类所需的私有访问,转换为Outer类上的包内可见(package-private)访问器方法access$000()。具有这样的合成访问器,即便它并非原始类的一个 Nestmate,了解该机制的开发人员都可以直接的或者通过反射访问它。

作为 Java 路线图的一部分,对访问控制采取整理措施在嵌套类型上表现得尤为突出,需要做一些清理。动机正如 JEP 中所给出的:

嵌套将由对一组类文件的正式定义构成。其中,Nestmate 共享通用的访问控制机制,使所需的结果以更简单、更完全、更透明的方式实现。

在 JEP 描述中还指出,未来改进可能包括:

  • 在泛型特化(generic specialization)中,每个特化类型(specialized type)可被创建为泛型的一个 Nestmate。
  • 支持对Unsafe.defineAnonymousClass() API 的安全替换,实现将新类创建为已有类的 Nestmate。
  • 可能会影响“密封类”(sealed classes),仅允许 Nestmate 的子类作为密封类。
  • 可能会影响私有嵌套类型。私有嵌套类型当前定义为包内可访问(package-access)。

密封类和真正私有类型的概念,对于使用 Scala(以及其它一些支持这些概念的语言)的开发人员并不陌生,因为它们提供了实现一些理念所必须的构建模块。例如,在模式匹配等高级特性中十分有用的代数数据类型(ADT,algebraic data type)。

Nestmate 将作为 Valhalla 项目的一部分开发,目前实现初始原型的工作正在顺利开展。OpenJDK 开发人员正积极参与其中。

Oracle 通常并不会对 Nestmates 这样的长线特性将于何时交付给出任何承诺。鉴于 Nestmates 对于当前正在开发的其它一些里程碑功能(例如密封类和模式匹配)非常有用,感兴趣的 Java 程序员应关注该项目的不断成熟。

查看英文原文: Java Nestmates Makes Progress

2018 年 3 月 21 日 19:001800
用户头像

发布了 381 篇内容, 共 99.8 次阅读, 收获喜欢 231 次。

关注

评论

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

直播预告 | 数据操作加速器,CloudQuery v1.3.5 发布

CloudQuery社区

sql 编辑器 数据治理 数据安全 数据库管理工具

Python OpenCV 彩色图像与灰度图像的转换

梦想橡皮擦

3月日更

开抢| 华为开发者大会2021(Cloud)早鸟票来了!

华为云开发者社区

华为 开发者

用 WebRTC 打造一个音乐教育 App,要解决哪些音质难题?

阿里云视频云

音视频 WebRTC 在线教育 RTC

量化策略软件搭建,马丁策略交易软件开发

13823153121

IAP:物联网终端软件升级技术

华为云开发者社区

IoT LiteOS iap 物联网终端 OTA

2021年Android面试心得,大厂面经合集

欢喜学安卓

android 程序员 面试 移动开发

NA公链(Nirvana)解决的六大问题在众多公链中脱颖而出NAC公链

区块链第一资讯

2021最新分享支付宝/美团/拼多多面经总结

比伯

Java 编程 架构 面试 程序人生

终于知道为啥网页不让我复制粘贴了!

华为云开发者社区

js 代码 button事件 复制粘贴 输入框

简单快速搭建,全新语聊方案

anyRTC开发者

ios android 音视频 WebRTC RTC

情指勤指挥调度平台搭建,公安局情报指挥系统

13823153121

畅想数据湖

数据社

数据仓库 数据湖 ETL ELT

20天内看完这套GitHub标星18k+的Android资料,含泪整理面经

欢喜学安卓

android 程序员 面试 移动开发

Spark性能调优-Shuffle调优及故障排除篇

五分钟学大数据

大数据 spark 3月日更

Apache Doris(incubating) 0.12.0版本正式发布

ApacheDoris

神策大数据技术直播系列课第二季,开讲啦

神策技术社区

大数据 性能优化 前端 工程师 事件分析

美女师姐说给你听!我成为蚂蚁安全工程师的初体验

DT极客

音视频开发——通信直播协议和视频推流丨RTMP-RTSP

Linux服务器开发

音视频 WebRTC ffmpeg 直播推流 SRS流媒体服务器

EGG Network构建千万级应用的聚合型永动金融公链 EFTalk

币圈那点事

K8s 原生 Serverless 实践:ASK 与 Knative

Serverless Devs

阿里云 Serverless Kubernetes 云原生

云原生数据库风起云涌,华为云GaussDB破浪前行

华为云开发者社区

数据库 架构 云原生 华为云 GaussDB

力扣(LeetCode)刷题,简单题(第14期)

不脱发的程序猿

面试 LeetCode 算法攻关 28天挑战 3月日更

2021年DevOps的四大趋势

禅道项目管理

DevOps 工具 趋势 Redis开发与运维

别再说你不懂规则引起啦

比伯

Java 编程 程序员 架构 计算机

MoviePy - 中文文档(一个专业的python音视频编辑库)教程

ucsheep

Python 音视频 视频剪辑 Moviepy 视频合成

2021出海社交必看:产品、技术、运营指南

拍乐云Pano

音视频 RTC 社交APP出海 出海社交 社交泛娱乐

10种下载YouTube视频的方法-包含网站软件插件app等

Space空间

软件 网站 下载youtube视频

GitHub已封神!百万人跪求的Java面试手册真就无敌了呗

Crud的程序员

Java 编程 架构

golang设置时区的多种方式

happlyfox

Go 学习 3月日更

MapReduce中shuffle阶段的数据压缩机制

大数据技术指南

大数据 hadoop 3月日更

数据库运维技术发展与展望

数据库运维技术发展与展望

Java Nestmate稳步推进-InfoQ