HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

关注

评论

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

Amadine for Mac 矢量图设计工具 完美兼容M1

彩云

矢量图设计 Amadine下载

iOS App Store上传项目报错 缺少隐私政策网址(URL)解决方法

雪奈椰子

朝夕光年游戏高光全套解决方案

字节跳动技术范儿

字节跳动 游戏开发

Vert.x 教程 (三):Vertx 应用的Operation

Kevin_913

提升团队合作效率,这10款可视化协作软件值得拥有!

彭宏豪95

团队协作 软件推荐 科技 在线白板 协同办公软件

云智慧联合北航提出智能运维(AIOps)大语言模型及评测基准

云智慧AIOps社区

大模型 人工智能「 运维‘ LLM模型

免费算力部署stable-diffusion

打工人!

Stable Diffustion

Ubuntu22.04系统搭建环境编译AOSP?

百度搜索:蓝易云

android Linux ubuntu 运维 AOSP

Linux网络、进程详解。

百度搜索:蓝易云

云计算 Linux 运维 云服务器 ECS

音频修复增强工具:iZotope RX 10 for mac 支持M1

加油,小妞!

音频修复 iZotope RX 10

原来你是这样的英特尔:全面解读英特尔产业故事

E科讯

【强推】苹果Mac电脑后期处理软件,打造极致的

Rose

Mac破解软件 后期特效软件有哪些 Mac特效制作工具 视频剪辑Mac版

苹果mac电脑GoLand 2023 注册码最新 GoLand 2023 中文下载「支持m1 m2」

Rose

Go 语言 GoLand 2023破解版 GoLand 2023注册码

从科幻走向现实,LLM Agent 做到哪一步了?

Zilliz

mac文件夹数据同步工具推荐 Sync Folders Pro中文最新版

胖墩儿不胖y

Mac软件 文件同步工具 文件备份同步

VM虚拟机安装Win11系统图文教程(附VMware13永久密钥)

Rose

Win11镜像下载 VM虚拟机破解版 VMware13永久密钥

Maya 2024 for Mac(3D图形软件)

展初云

maya Mac软件 玛雅 3D图形

火热的低代码平台

树上有只程序猿

低代码平台

Python 包管理器入门指南

小万哥

Python 程序员 软件 后端 开发

【最新破解秘钥】Vectorworks 2023 Mac必备3D建筑设计软件

Rose

3D建筑设计软件 Mac破解软件 Vectorworks 2023下载 Vectorworks 2023密钥

强大日志查看器,助力数据联动分析

观测云

数据分析 日志分析 关联分析

AIGC | 如何用“Flow”,轻松解决复杂业务问题

极光JIGUANG

制造行业数字化运维破局之道

云智慧AIOps社区

「支持M1/M2」Topaz Video AI for mac 4.0.3

加油,小妞!

Topaz Video AI 视频增强修复工具

SRM招标采购系统:功能详解及源码获取

金陵老街

免费算力部署ChatGLM3-6B大语言模型

打工人!

大模型

什么是Vim,Vim安装

梦笔生花

mac音频传输工具Loopback激活版 完美兼容macOS14系统和M芯片

Rose

mac音频编辑器 Loopback下载 Loopback激活版 Loopback Mac版

Mac电脑版专业矢量绘图软件 Amadine 最新激活版

mac大玩家j

Mac软件 矢量绘图软件 矢量绘图工具

支持m1、IntelliJ IDEA 2023.2.4 Mac中文版 附 注册码

彩云

IntelliJ IDEA 2023最新 IntelliJ IDEA 2023

倒计时丨距离RestCloud新品发布仅有6天!

RestCloud

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