后Java9时代的Java演进

一再的推迟之后,Java9终于要在这个月发布了。Java9的主要特性,代号Jigsaw的模块系统,原本预计是在Java7中加入,从提出至今已经过去十年的时间。

当时的SUN日薄西山,之后又被Oracle收购,长期的动荡使得SUN无法对JDK的开发提供充足和稳定的支持;JCP中大公司之间的政治斗争和低效的流程也严重拖累了进度。在这段编程语言演进日新月异,新语言层出不穷的时间里,Java已经显露出老旧的疲态而被新兴公司及开发人员不屑的吐槽。

在Java9之后,Oracle通过数个项目提出了一系列的JEP,若能实现将是继Java8 lambda表达式之后的又一次重大特性更新。

1. Project Valhalla

这个项目负责需要对JVM进行修改的特性,主要包含:

  • JEP 169: Value Objects 自定义的值类型
  • JEP 218: Generics over Primitive Types 值类型泛型支持

1) 自定义值类型。Java除了八个原生类型之外,只能定义引用类型,不支持自定义的值类型。引用类型本身有着对象头,指针的额外内存开销,并且会加重GC工作,数据局部性差而影响CPU cache命中。

自定义的值类型可以定义类似于原生类型的组合类型,没有对象头开销,没有堆上的内存分布,局部性更好。自定义的值类型现在设计为Immutable,不能继承,但是可以实现接口。

public @Value class Complex {
    private final double real;
    private final double imaginary;
    //..... }

由于值类型无额外开销,将来会重新用来实现Java8中添加的Optional,日期时间类等。

2) 值类型泛型允许在泛型中直接使用原生类型和自定义的值类型,省去了box/unbox的开销,也避免了使用引用类型的GC开销和局部性差的问题。

List<int> list = new ArrayList<>();

2. Project Amber

这个项目主要目标是让简化开发,让代码更清晰更容易维护。Java被黑的最惨的啰嗦的问题,将得到根本性的解决。

主要包含的特性有:

  • JEP 286: Local-Variable Type Inference 本地变量类型推导
  • JEP 301: Enhanced Enums 增强的枚举类,主要是枚举变量可以使用不同的泛型类型
  • JEP 302: Lambda Leftovers Lambda表达式的语法改进,对没有使用的变量可以使用_代替,以及有单独的子作用域
  • Data Class 纯数据类,这个还目前没有JEP 提案
  • JEP 305: Pattern Matching 模式匹配

1) 本地变量类型推导。终于可以使用var这个关键字了,可以有效的降低编码时的思维负担, 缩减代码行长度和import类的数量。。

var list = new ArrayList<String>();
var stream = list.stream();

2) Data Class 是指只有Field,及对应的Getter/Setter的类。对于这样的类通常你会需要IDE帮忙生成一大堆代码:Getter, Setter, ToString, HashCode, Equals…

Data Class 将在语法层面对此自动支持,免去每次需改都要重新生成一大堆方法的工作,也除去了代码中无用的信息,让代码结构更加清晰。因为还没有提出JEP,目前这个特性语法将是怎样,还不太清楚。

public class User(String firstName, String lastName, DateTime birthday) { }

3) Pattern Matching 在Scala,Kotlin等语言中已经广泛实现的特性,目前的设计是复用了switch关键字。

String formatted;
switch (obj) {
    case Integer i: formatted = String.format("int %d", i); break;
    case Byte b:    formatted = String.format("byte %d", b); break;
    case Long l:    formatted = String.format("long %d", l); break;
    case Double d:  formatted = String.format("double %f", d); break;
    case String s:  formatted = String.format("String %s", s); break  default:        formatted = obj.toString();
}

解构Destruction. 这个是和Data Class配合的Pattern Match:

int eval(Node n) {
    switch(n) {
        case IntNode(int i): return i;
        case NegNode(Node n): return -eval(n);
        case AddNode(Node left, Node right): return eval(left) + eval(right);
        case MulNode(Node left, Node right): return eval(left) * eval(right);  default: throw new IllegalStateException(n);
    };
}

3. Project Panama

改善JVM堆内存布局,以及外部Native API的交互。目前包含:

  • Arrays 2.0 – 二维数组,超长数组(>2^31,使用long类型下标), immutable数组,volatile数组元素,向量运算API等特性
  • JEP 191: Foreign Function Interface 与现在的JNA比较相近,相比较现在的JNI更易使用,无需生成c++wrapper代码,性能更好。
  • Layout: 对Class,Array等数据结构的内存布局进行控制

当然,这些项目能不能加入Java10?Java10发布会不会延期?按照之前几个Java版本的尿性,回答并不乐观啊。

    原文作者:hsiafan
    原文地址: https://zhuanlan.zhihu.com/p/29036466
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞