2022年Java将有什么新的特性和改进,我相信很多Java开发者都想知道。结合Java语言架构师布莱恩·格茨Brian Goetz)最近的一些分享,胖哥给大家爆个料。老规矩,点赞、再看、转发、星标走起。

Valhalla

布莱恩·格茨在去年底发表了一篇名为State of Valhalla的文章,里面信息量非常大,里面提到早在2014年Java项目组就启动了一个名叫Valhalla的项目,这个项目将为JVM平台带来更加灵活的、扁平化的数据类型。在2021年该项目将有进一步的动作,值对象(value objects)原始类(primitive classes)专用泛型(specialized generics)即将引入JVM平台。

我们知道什么是“值”,什么是“对象”,但是什么是“值对象”呢?不光你们懵逼,我也是一脸懵逼,来一起看看。

Java类型系统的不足

Java的类型系统

Java类型系统由内置的10种类型组成,这10种类型无法直接表达复杂的数据结构,例如字符串、三维坐标、空间向量等等,但是开发者可以用这10种类型来为业务实体建模,Java的类型体系是非常有用的。

但是Java类型仍然存在“缺陷”, 同一个类的两个对象包含完全相同的属性,但是它们的内存寻址是不一样的。

所以从某种意义上说,他们有自己的身份标识。

但是对于原始类型就不一样了,如果一个int类型的变量值为7,另一个也为7,区分它们有意义吗?这个7还是那个7?显然是无意义的。

让我们再来举一个现实中的例子,两件相同尺寸、材质的红色衣服肯定是两件不同的衣服,但是它们的材质肯定是一种材质,颜色肯定是一种颜色,不会有傻子认为这是两种颜色。这里面的尺寸当然可以通过Java中的原始类型去描述,但是材质和颜色不行(虽然颜色可以用十六进制表示),这里的尺寸、材质、颜色都应该被认为是原语。

这个痛点促使了Valhalla项目的诞生。

对象头

为了理解Valhalla引入的 Value Object / Class 和 Primitive Object / Class 概念能够给我们带来了什么,我们需要看看JVM是如何将对象保存在内存中的。

对象头对类的对象非常重要,决定哪个线程可以访问对象、垃圾收集器标记、对象hash;更重要的还有对象的类型指针,它能够在运行时动态访问对象的类,并从其类到该对象的详细信息,比如继承多态、反射。最近我还整理了一批包括C++、java、Python、JavaScript等各种语言,还有操作系统、数据结构、设计、网络等各方面的学习资料,大家可以关注公众号TJ君,回复武功秘籍领取。

但是凡事都有两面性,Java对象内存占用的大小取决于它所包含的信息的总和,对象头在 64 位系统上至少需要 16 个字节,在 32 位系统上至少需要 8 个字节(当然JVM可以通过配置项去设置如何保存对象头)。很多对象不需要多线程,也不需要什么对象标识,就像上面提到的衣服的颜色,只有颜色的值才是我们关心的事。这种冗余的内存占用让Java为人诟病。

Value Class

对于许多对象来说,它属性值的相等性是我们关心的,其它类信息没什么用,而且只为保存值和对这些值进行操作而编写的类在所有类中所占的比例非常大。Valhalla项目为这样的场景引入了一个新的类类型:Value Class。目前还只是JEP草案,但是已经初具形态:

value class Substring implements CharSequence {private String str;private int start;private int end;public Substring(String str, int start, int end) {checkBounds(start, end, str.length());this.str = str;this.start = start;this.end = end;}public int length() {return end - start;}public char charAt(int i) {checkBounds(0, i, length());return str.charAt(start + i);}public Substring subSequence(int s, int e) {checkBounds(s, e, length());return new Substring(str, start + s, start + e);}public String toString() {return str.substring(start, end);}private static void checkBounds(int start, int end, int length) {if (start < 0 || end < start || length < end)throw new IndexOutOfBoundsException();}
}

Value Class和我们常见的类差不多,但是它可能(这里依然在讨论中)具有下面一些特性:

  • 值对象是没有身份的对象,通常情况下我们用==运算符检查身份,这里可能和equals()不再有区别。

  • 值类本身和它的所有字段默认都是final的。

  • 该类不直接或间接地实现java.lang.IdentityObject(有身份标识类的新超类)。这意味着超类要么是无状态抽象类,要么Object是无状态抽象类。

  • 值类都是java.lang.ValueObject的隐式实现。

  • 没有构造super函数调用构造函数。将在不执行任何超类初始化代码的情况下创建实例。

  • 无法在值类中使用synchronized关键字。

  • (可能)该类没有声明finalize()方法。

  • (可能)构造函数不使用this来设置构造函数主体中的字段,或者可能在所有字段都明确内存分配之后。

其它的操作和普通的类应该差别不大,但是要注意的是,JDK标准库中的一些原有类如果被认定为Value Class需要做兼容性处理。

value要成为保留字还是关键字?

这不是全部

Value Class对Java类对象头进行了阉割,有利于降低Java的内存消耗,但是这不是Valhalla计划的全部。对于这一部分过于超前的内容,我写起来其实是很有困难的,构思了好几天,从场景出发来了解一门编程语言的设计有利于从根本提高自己。如果你想了解更多关于Valhalla的东西,可以关注并星标这个宝藏公众号。

对了,我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。

推荐阅读

  • 大揭秘!抖音稳定性是如何保障的?

  • 经常误提交.DS_Store文件怎么办?

  • 微软使用“钞能力”:687 亿美元收购动视暴雪!

前沿技术早知道,弯道超车有希望

积累超车资本,从关注DD开始

点击阅读原文,送你免费Spring Boot教程!

Java前沿分享:value或许成为java的新关键字相关推荐

  1. 好程序员Java培训分享如何快速入门Java编程

    好程序员Java培训分享如何快速入门Java编程,作为老牌编程语言,Java拥有广阔的市场应用,企业对Java人才的需求一直居高不下.有很多非专业.零基础的人想要学习Java却不知道怎么快速入门,接下 ...

  2. Java培训分享5个常用Java代码混淆器

    对于Java程序员来说,如果辛辛苦苦写的代码被人摽窃走,将是一件非常恼火的事情.如何保护自己的代码呢,可以通过逆向工程反编译得到Java程序的源代码,这种反编译工具之一就是JAD,尽可能给反编译人员制 ...

  3. java基础分享_一、java基础教程

    1.java是一门比较纯粹的面向对象编程语言,所以java的所有代码都必须写在类的内部. 1.1 java的可执行文件后缀名是".java",例如HelloWorld.java,并 ...

  4. 超硬核的Java工程师分享,什么是Java?为什么我要做Java,我是如何学习Java的?

    Java是啥 新手程序员通常会走入一个误区,就是认为学习了一门语言,就可以称为是某某语言工程师了.但事实上真的是这样吗?其实并非如此. 今天我们就来聊一聊,Java 开发工程师到底开发的是什么东西.准 ...

  5. sqlsever主库从库如何切换_超硬核的Java工程师分享,什么是Java?为什么我要做Java,我是如何学习Java的?...

    Java是啥 新手程序员通常会走入一个误区,就是认为学习了一门语言,就可以称为是某某语言工程师了.但事实上真的是这样吗?其实并非如此. 今天我们就来聊一聊,Java 开发工程师到底开发的是什么东西.准 ...

  6. 小猿圈Java讲师分享开发9年Java进阶大全

    IT程序员每天都与代码拼死搏斗,加班已成为家常便饭,为了升职加薪还要夜以继日的学习,对于只会ctrl+c和ctrl+v的真的是很是惭愧呀,为了更好的引导正在学习java编程的小伙伴,今天我让小猿圈的J ...

  7. javaweb模板_好程序员Java教程分享javaweb框架

    好程序员Java教程分享javaweb框架:Java是开源的,框架很多,这些框架都能解决特定的问题,提高开发效率.简化我们的代码复杂度,现在除了很多大家通用的一些主流框架外,很多公司针对自己的业务会自 ...

  8. 万字长文分享,如何自学Java(方法+步骤)

    ​ 目录 收起 大家存在的问题 为什么我觉得方法很重要? 五个步骤学习Java 第一阶段:揽全局 「怎么办?你需要的是系统化学习!」 教程式笔记 我的大学 我准备从思想方法和具体的学习步骤上给大家聊一 ...

  9. java培训分享:java培训架构师学习线路图

    本期java教程分享主要是讲解关于java培训架构师方面的内容,主要针对java架构师的学习线路图进行一个知识点的概括,下面来看看学习java架构师都需要了解哪些内容吧. java培训分享:java培 ...

最新文章

  1. 一款vue编写的功能强大的swagger-ui,有点秀(附开源地址)
  2. 创建JUNIT测试类
  3. Js下载文件到本地(兼容多浏览器)
  4. Android异步处理三:Handler+Looper+MessageQueue深入详解
  5. boost::thread_group相关的测试程序
  6. MySQL主备复制原理、实现及异常处理
  7. Oracle和MySQL的几点区别
  8. preferredsize JAVA_Java JScrollPane.getPreferredSize方法代码示例
  9. 调用目标检测百度接口api
  10. ollydebug+C32Asm
  11. Redis命令之hscan
  12. 算法实例(2)_遗传算法
  13. c语言可以绘制中国地图源码,echarts画中国地图,省市区地图分享
  14. Panda白话 - G1垃圾收集器
  15. 关于ARPG发展之操作和技能之泛泛而谈(转)
  16. java 验证手机号
  17. 蓝标智能营销转型之战 ——Oracle Eloqua 市场营销云助力蓝标盈云迎战全渠道营销...
  18. 最优化之凸集、凸函数、上确界、Jensen不等式、共轭函数、Fenchel不等式、拉格朗日乘子法、KKT条件
  19. Mac系统如何一键返回桌面?
  20. 人人都是产品经理 产品经理培训 互联网产品经理

热门文章

  1. EPANET头文件解读系列7——MEMPOOL.H
  2. WCF+Silverlight部署本机备忘
  3. 国庆广州(羊城)之旅
  4. linux c getrlimit sysconf 系统限定 实例
  5. golang 生成 解析 json
  6. 散列算法 SHA-1,SHA-2和SHA-256之间的区别
  7. python3 报错 Resource temporarily unavailable
  8. linux curl 命令 http请求、下载文件、ftp上传下载
  9. linux c access 函数 文件 目录 路径 是否存在
  10. Java与Unicode