博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Nestmate稳步推进
阅读量:6902 次
发布时间:2019-06-27

本文共 2871 字,大约阅读时间需要 9 分钟。

\

看新闻很累?看技术新闻更累?试试,每天上下班路上听新闻,有趣还有料!

\
\\

Oracle提出了,即“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.\"\":()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\}\
\\

\\
\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.\"\":()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\}\
\\

编译器将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将作为的一部分开发,目前实现初始原型的工作正在顺利开展。OpenJDK开发人员正积极参与其中。

\\

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

\\

查看英文原文:

转载地址:http://vzvdl.baihongyu.com/

你可能感兴趣的文章
fork是linux函数吗,关于LINUX中的FORK函数
查看>>
红旗linux 进不去图形界面,进不了红旗Linux6.0的图形界面请高手帮忙
查看>>
linux安装中文语言命令,Centos使用yum命令安装中文语言包(fonts-chinese.noarch,m17n-db-common-cjk)...
查看>>
linux添加Qt的fontconfig,QT__qt SDK------Fontconfig-2.4.2安装 (二)
查看>>
linux 查看io调度策略,磁盘IO调度策略
查看>>
高通笔记本装linux,在华硕畅370(TP370QL)骁龙笔记本上安装Ubuntu 18.04 ARM64的方法...
查看>>
linux sysfs属性,linux-sysfs
查看>>
c语言int speed=1,求大神帮忙看看这个弹弹球消砖块的游戏代码,为什么speed只能15...
查看>>
c语言如何控制误差小于10-n,C语言使用注意事项(二)
查看>>
c语言黑白棋图形,C语言黑白棋游戏[转载]
查看>>
Grunt 入门指南2:任务配置
查看>>
nullnullsql 多条件查询
查看>>
js 字符串转换数字
查看>>
ASP.NET伪静态 UrlRewrite(Url重写) 实现和配置
查看>>
函数调用Java Web使用swfobject调用flex图表
查看>>
加中实训第二天(笔记+代码) - 2013.5.29 (待完善)
查看>>
《JavaScript DOM 编程艺术》小结
查看>>
MYSQ提高L查询效率的策略总结
查看>>
java--九九乘法表
查看>>
服务器端几种分页方式的性能分析
查看>>