【QCon】精华内容上线92%,全面覆盖“人工智能+”的典型案例!>>> 了解详情
写点什么

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

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

关注

评论

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

微服务架构组件总结篇

邱学喆

负载均衡 Spring Cloud 注册中心 配置中心 熔断服务

下一代TCP: 网络演进的平台

俞凡

TCP 网络

SQL Sever提供的字符串类型

乔乔

11月月更

HTML学习笔记(二)

lxmoe

html 前端 学习笔记 11月月更

云原生系列四:Yelp 如何在 Kubernetes 上运行 Kafka

叶秋学长

kafka Kubernetes 云原生 11月月更

Vue组合式函数(二)封装一个请求

Augus

Vue3 11月月更

从3开始,在业务系统中增加分页功能

海风极客

go语言 11月月更 后端系统

2022-11-05:给定一个逆波兰式,转化成正确的中序表达式。要求只有必要加括号的地方才加括号。

福大大架构师每日一题

算法 rust 福大大

QUIC不是TCP的替代品

俞凡

TCP 网络 QUIC

华为开发者大会2022:HMS Core 3D建模服务再升级,万物皆可驱动

HMS Core

hdc HMS Core

【C语言】char 关键字

謓泽

11月月更

JavaScript基本数据类型和引用数据类型详解

肥晨

js 11月月更 数据结构js

pyside6 qml 支持更新液位的伪3D圆柱

Mr_No爱学习

学生管理系统考试试卷存储方案设计

乖乖IvyShine

易观千帆 | 2022年9月银行APP月活跃用户规模盘点

易观分析

金融 手机银行

美图是如何搭建压测监控一体化平台的?

TakinTalks稳定性社区

压测平台

从零到一带你构建可靠的大型分布式系统,不愧是IT领域又一神作!

Java永远的神

Java 分布式 程序人生 后端 架构师

架构实战营模块 4 作业

陌生流云

#架构实战营

一款设计和模拟数字逻辑电路的LogiSim工具

攻城狮Wayne

集成电路 Verilog 11月月更 logisim 模电与书店

Sonatype Nexus 如何把多仓库合并在一起

HoneyMoose

图片懒加载

源字节1号

软件开发

超全!前端面试题大汇总

肥晨

前端面试题 11月月更 超全前端面试题

Redis 的 Sentinel 系统

月明风清

redis Sentinel 系统 哨兵机制

SQL 碎碎念,你可能用不到但不能不知道的数据库技巧(2)

百里丶落云

数据库 后端 11月月更

简单剖析开发:区块链杠杆合约交易所的核心优势

W13902449729

区块链交易所 合约交易所开发

去哪儿的常态化容量保障是怎么做的?

TakinTalks稳定性社区

Grafana 最新开源项目 Phlare 速体验

Grafana 爱好者

云原生 可观测性 Grafana 11月月更

还担心接口乱糟糟?快来试试“斯瓦格”在线文档管理平台!

wljslmz

华为云 接口管理 swagger 11月月更

Go语言入门13—并发

良猿

Go golang 后端 开发 11月月更

永续合约交易所的开发有哪些特征?

W13902449729

合约交易所开发 区块链交易所开发

基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v6.1版已发布

JackJiang

即时通讯 MobileIMSDK im开发 开源im

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