JDK 16 昨日正式发布,新特性实践尝鲜来啦!
新特性一览
▐ 本文将解读的新特性
▐ 其他的新特性
立即尝鲜
jenv add ${JDK16_Path}
jenv global openjdk64-16
java -version
openjdk version "16"2021-03-16
OpenJDK Runtime Environment (build 16+36-2231)
OpenJDK 64-Bit Server VM (build 16+36-2231, mixed mode, sharing)
Cannot determine path to 'tools.jar' library for 16 (path/to/jdk-16) when running from IDEA, you should update to the latest version.
新特性解读
▐ 迁移到GitHub
版本控制元数据大小方面,转换后的存储库的初始原型已显示出版本控制元数据的大小显着减少。例如,使用Git的jdk仓库的.git目录大约为300MB,而使用Mercurial的.hg目录大约为1.2GB。减少元数据可保留本地磁盘空间并减少克隆时间,同时减少传输的数据。
可用工具方面,与Mercurial相比,Git可用的工具更多。所有的文本编辑器都可以本地或通过插件实现Git集成。此外,几乎所有的IDE都带有Git集成,包括Eclipse、Visual Studio、IDEA。
可用托管方面,有许多选项可用于托管Git仓库,无论是自托管还是作为服务托管。使用外部源码托管提供程序的原因包括性能、与开发人员进行交互的Web API的访问权限控制 以及 蓬勃发展的社区。
通过fork一份JDK 16源码仓库(https://github.com/openjdk/jdk),可以一边阅读源代码,一边做笔记并提交,方便持续学习JDK源码。使用Git的upsteam保持JDK源码的更新,同时也保持自我更新。
如网速够快,通过Github在线阅读代码的工具Github1s(https://github.com/conwnet/github1s),快速在浏览器中翻阅JDK 16源码(https://github1s.com/openjdk/jdk/releases/tag/jdk-16%2B35)也是非常方便。
▐ 将JDK移植到Alpine Linux
更小的镜像体积分发时会更加迅速
应用程序/容器的启动要迅速
▐ 构建Alpine Linux镜像
# 获取Alpine Linux镜像
docker pull alpine
# 运行镜像
docker run alpine echo'Hello Alpine!'
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest 7731472c3f2a 7 weeks ago 5.61MB
▐ 添加JDK 16
▐ 运行Spring Boot
FROM openjdk:16-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
▐ 构建并运行
# 构建镜像,设置JAR_FILE参数指向Spring Boot程序Jar包路径
docker build --build-argJAR_FILE=target/rest-service-0.0.1-SNAPSHOT.jar -t alpine-jdk16-app:latest .
# 查看镜像
docker images
# 根据镜像,启动容器运行
# -d参数 后台运行
# -p参数 Spring Boot默认端口8080,映射到容器端口8080
docker run -d-p8080:8080 alpine-jdk16-app:latest
# 查看容器运行
docker ps
# 验证成功之后可以停止容器
docker stop${CONTAINER_ID}
# 访问应用
curl-w'\n' http://127.0.0.1:8080/greeting?name=jdk16
记录类
隐式声明了属性
隐式声明了构造器
隐式声明了equals()、hashCode()、toString()
隐式声明了属性的访问器,访问器名称与属性同名
public record Point(int x, int y) {}
List<Merchant>findTopMerchants(List<Merchant> merchants, int month) {
// Local record
record MerchantSales(Merchant merchant, double sales) {}
// 使用MerchantSales Record类临时包装merchant和sales,方便做处理。
return merchants.stream()
.map(merchant ->new MerchantSales(merchant, computeSales(merchant, month)))
.sorted((m1, m2) ->Double.compare(m2.sales(), m1.sales()))
.map(MerchantSales::merchant)
.collect(toList());
}
▐ 模式匹配
if (obj instanceofString) {
String s = (String) obj;
...
}
if (obj instanceofString s) {
// 通过使用模式匹配可以直接使用s局部变量
...
}
publicbooleanequals(Object o) {
if (!(o instanceof Point))
returnfalse;
Point other = (Point) o;
return x == other.x && y == other.y;
}
publicbooleanequals(Object o) {
return (o instanceof Point other)
&& x == other.x && y == other.y;
}
if (a instanceof Point p) {
// p is in scope
...
} else {
// p not in scope here
}
// p not in scope here
if (b instanceof Point p) { // Sure!
...
}
if (x instanceofInteger num) { ... }
elseif (x instanceofLong num) { ... }
elseif (x instanceofDouble num) { ... }
尾声
JDK 9 模块系统、JShell交互式命令行
JDK 10 局部变量类型推断
JDK 11 ZGC试用、HTTP Client API、Steam等增强
JDK 12 switch表达式扩展、增加基于JMH的一套微基准套件
JDK 13 Socket API 重构、文本块(多行文本)
JDK 14 更有价值的NPE错误信息、JDK 16特性的部分预览
JDK 15 密封类、Record类等JDK 16特性的预览
参考资料
JDK 16 的状态、发布计划与新特性
(http://openjdk.java.net/projects/jdk/16/)
JDK 16: The new features in Java 16
(https://www.infoworld.com/article/3569150/jdk-16-the-new-features-in-java-16.html)
Java源代码仓库迁移到Github
(https://www.infoworld.com/article/3569068/javas-move-to-github-set-for-september.html)
在Alpine + OpenJDK镜像中运行Spring Boot
(https://blogs.oracle.com/developers/running-spring-boot-in-a-docker-container-on-openjdk,-oracle-jdk,-zulu-on-alpine-linux,-oracle-linux,-ubuntu)
JEP 394: Pattern Matching for instanceof
(https://openjdk.java.net/jeps/394)
JEP 395: Records
(https://openjdk.java.net/jeps/395)
JEP 397: Sealed Classes (Second Preview)
(https://openjdk.java.net/jeps/397)
加入我们
业务高可用的解决方案与核心能力(精细化流量管控Marconi平台:为业务提供自适应流控、隔离与熔断的柔性高可用解决方案,站点高可用:故障自愈、多机房与异地容灾与快速切流恢复
新一代的业务研发模式FaaS(一站式函数研发Gaia平台)
下一代网络协议QUIC实现与落地
移动中间件(API网关MTop、接入层AServer、消息/推送、配置中心等等)
作者|熊政(八风)
编辑|橙子君
出品|阿里巴巴新零售淘系技术