写点什么

Java Nestmate 稳步推进

  • 2018-03-21
  • 本文字数:2072 字

    阅读完需:约 7 分钟

看新闻很累?看技术新闻更累?试试下载 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-03-21 19:002709
用户头像

发布了 391 篇内容, 共 150.7 次阅读, 收获喜欢 257 次。

关注

评论

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

月光宝盒(vivo流量录制回放平台)正式对外开源

vivo互联网技术

自动化测试 流量回放 流量录制

最佳实践:马来西亚第一大电子钱包通过阿里云EMAS测试提效6倍

云布道师

阿里云

移动端动态更新背后的原理及技术原理

没有用户名丶

GaussDB(DWS)集群中寻找节点CPU占用高的语句

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

基于OCR进行Bert独立语义纠错实践

华为云开发者联盟

人工智能 华为云 OCR 华为云开发者联盟 企业号 4 月 PK 榜

果然!GitHub上哄抢的500页微服务前后端分离开发手册,是出自Alibaba

Java 微服务 Spring Boot Vue 前后端分离

请您关注我们! 开源免费独立站BeikeShop——新一代跨境电商系统

BeikeShop

开源 跨境电商 电商系统 独立站 自建网站

华泰证券与易观千帆达成合作,促进数字用户活力

易观分析

金融 证券

HummerRisk 使用教程:操作审计

HummerCloud

云安全

【3.31-4.7】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

WorkPlus企业IM即时通讯私有化部署,从源头把控安全

BeeWorks

基于FFmpeg和Wasm的Web端视频截帧方案

百度Geek说

ffmpeg webassembly 企业号 4 月 PK 榜 视频截帧

高频面试:如何解决MySQL主从复制延时问题

Java MySQL 面试 主从复制

IO流中「线程」模型总结

Java 架构

互联网坊间鄙视链,现在反过来了?

博文视点Broadview

DevEco Device Tool 3.1 Release新版本发布,新增资源管理器、SFTP、HDC

HarmonyOS开发者

HarmonyOS

京东LBS推荐算法实践

京东科技开发者

算法 推荐算法 企业号 4 月 PK 榜 排序模型 LBS推荐算法

平均互信息与条件熵

timerring

信息论

BSN季度版本2023年3月31日迭代更新

BSN研习社

StampedLock:JDK1.8中新增,比ReadWriteLock还快的锁

华为云开发者联盟

线程 开发 华为云 华为云开发者联盟 企业号 4 月 PK 榜

“阿里味”的「Redis核心实践全彩手册」给你,还学不会就转行吧

Java 数据库 redis 缓存 面试

Redis集群介绍及测试思路

京东科技开发者

redis redis集群 主从复制 redis哨兵集群 企业号 4 月 PK 榜

真正的AGI,既然是高度仿真人类的,是否可能也要经历过恐惧的体验?

FinClip

pnpm 之降本增效

京东科技开发者

前端 npm 企业号 4 月 PK 榜 node_modules

团队RONG合三状态,您的团队是哪一种?

禅道项目管理

天翼混合云一体机iStack解决方案直播

天翼云开发者社区

BSN-DDC基础网络详解(七):BSN-DDC官方合约市场

BSN研习社

Laplace分布算子开发经验分享

华为云开发者联盟

开发 华为云 正态分布 华为云开发者联盟 企业号 4 月 PK 榜

CVPR 2023 | 单阶段半监督目标检测SOTA:ARSL

飞桨PaddlePaddle

深度学习 目标检测 百度飞桨

软件测试丨构建高效的Web自动化测试环境及Web自动化测试实战

测试人

软件测试 自动化测试 测试开发 Web自动化测试

API First 再先一步,OpenAPI 定义被 openAI 定为 ChatGPT 插件标准

Apifox

人工智能 OpenAPI openai 开放api ChatGPT

Java Nestmate稳步推进_Java_Ben Evans_InfoQ精选文章