当前位置: 华文问答 > 数码

现在看来,许多编程语言中的「基本类型」是一种设计失败吗?

2022-05-18数码

我更倾向于认为这是一种妥协,而不是设计上的失败

因为在当时那个年代,有它的道理,因为在java设计之初,机器的性能远没有今天那么强大,所以当时的人们,为了性能考虑,所以保留了原始数据类型,也就是primitive type,也就是你说的基本类型

但是后续的语言的发展,就是纷纷干掉基础数据类型,primitive type,而将其做成object和 class,也就是类和对象,让语言自身实现更加纯粹的面向对象,比如scala

时至今日,很多语言都已经实现了比当时java更加纯粹的面向对象,比如dart,swift,kotlin,当然还有scala

这些语言的原始数据类型本身就是类的对象,你可以实现诸如这种操作

var s = 5. toString (); // 伪码,返回字符串 "5"

对,double,int等原始数据类型本身可以有方法,因为它是对象

然后java自身也在逐步向这些语言靠拢,也就是valhalla英灵殿项目,北欧神话都很熟悉了,奥丁,雷神以及他的锤子,瓦尔基里,也就是女武神,芙蕾雅,冰狼芬里尔

为什么叫英灵殿呢,因为英灵殿是维京战士们死后,灵魂聚集的地方,被女武神瓦尔基里收集起来,在英灵殿里天天继续练习,互相厮杀,每天死后复活,次日继续厮杀,如此反复,为命中注定要到来的诸神黄昏做准备

java用这个项目命名值类型,也就是value class,值类和对象,因为值类型本身没有对象头,所以有点像是灵魂一样,缺少了一些部分,然后经常被拷贝,就像英灵殿里的灵魂一样,时不时被复活

java的值类型做好之后,会进一步提供一个原始类,也就是primitive class,primitive class是一种特殊的value class,区别在于primitive object不能为空,而value object可以

然后后续会把primitive type给做成primitive class,也就是原始数据类型会变成原始数据类和对象,那样int,double这些,就会变成primitive class Integer的同义词,从而实现类似dart,swift,kotlin等语言那种

5.toString(); 这种方法,实现了这个之后,java就会成为真正意义上的完全的面向对象语言,里面所有的type,都是object,对象,不管是方法还是原始数据类型

然后对象变多的同时,对gc也提出了更高的要求,因为值类型会尽量内联对象,而且会向immutable不可变靠拢,任何对于对象的改变,都会生成一个新的对象,所以对象数量会增加,那gc的停顿就会成为问题,如果gc的pause时间太长,很明显会影响用户体验,所以英灵殿项目也是在zgc,shenandoah等短暂停gc项目完成之后,才逐步展开,有了低于1ms暂停的gc,再也不怕对象太多了