2022年Java將有什么新的特性和改進(jìn)因宇,我相信很多Java開發(fā)者都想知道贷盲。結(jié)合Java語(yǔ)言架構(gòu)師布萊恩·格茨(Brian Goetz)最近的一些分享队塘,胖哥給大家爆個(gè)料整袁。老規(guī)矩账忘,點(diǎn)贊走起志膀。
Valhalla
布萊恩·格茨在去年底發(fā)表了一篇名為State of Valhalla的文章熙宇,里面信息量非常大,里面提到早在2014年Java項(xiàng)目組就啟動(dòng)了一個(gè)名叫Valhalla的項(xiàng)目溉浙,這個(gè)項(xiàng)目將為JVM平臺(tái)帶來(lái)更加靈活的烫止、扁平化的數(shù)據(jù)類型。在2021年該項(xiàng)目將有進(jìn)一步的動(dòng)作戳稽,值對(duì)象(value objects)馆蠕、原始類(primitive classes)、專用泛型(specialized generics)即將引入JVM平臺(tái)惊奇。今天先來(lái)聊聊這個(gè)值對(duì)象是個(gè)啥互躬。
我們知道什么是“值”,什么是“對(duì)象”颂郎,但是什么是“值對(duì)象”呢吼渡?不光你們懵逼,我也懵逼乓序,來(lái)一起研究研究寺酪。
Java類型系統(tǒng)的不足
Java類型系統(tǒng)由內(nèi)置的10種類型組成,這10種類型無(wú)法直接表達(dá)復(fù)雜的數(shù)據(jù)結(jié)構(gòu)替劈,例如字符串寄雀、三維坐標(biāo)、空間向量等等陨献,但是開發(fā)者可以用這10種類型來(lái)為業(yè)務(wù)實(shí)體建模盒犹,Java的類型體系是非常有用的。
但是Java類型仍然存在“缺陷”眨业, 同一個(gè)類的兩個(gè)對(duì)象包含完全相同的屬性急膀,但是它們的內(nèi)存尋址是不一樣的。
所以從某種意義上說(shuō)坛猪,他們有自己的身份標(biāo)識(shí)脖阵。
但是對(duì)于原始類型就不一樣了,如果一個(gè)int
類型的變量值為7
墅茉,另一個(gè)也為7
,區(qū)分它們有意義嗎呜呐?這個(gè)7
還是那個(gè)7
就斤?顯然是無(wú)意義的。
讓我們?cè)賮?lái)舉一個(gè)現(xiàn)實(shí)中的例子蘑辑,兩件相同尺寸洋机、材質(zhì)的紅色衣服肯定是兩件不同的衣服,但是它們的材質(zhì)肯定是一種材質(zhì)洋魂,顏色肯定是一種顏色绷旗,不會(huì)有傻子認(rèn)為這是兩種顏色喜鼓。這里面的尺寸當(dāng)然可以通過(guò)Java中的原始類型去描述,但是材質(zhì)和顏色不行(雖然顏色可以用十六進(jìn)制表示)衔肢,這里的尺寸庄岖、材質(zhì)、顏色都應(yīng)該被認(rèn)為是原語(yǔ)角骤。
這個(gè)痛點(diǎn)促使了Valhalla項(xiàng)目的誕生隅忿。
對(duì)象頭
為了理解Valhalla引入的 Value Object / Class 和 Primitive Object / Class 概念能夠給我們帶來(lái)了什么,我們需要看看JVM是如何將對(duì)象保存在內(nèi)存中的邦尊。
對(duì)象頭對(duì)類的對(duì)象非常重要背桐,決定哪個(gè)線程可以訪問(wèn)對(duì)象、垃圾收集器標(biāo)記蝉揍、對(duì)象hash链峭;更重要的還有對(duì)象的類型指針,它能夠在運(yùn)行時(shí)動(dòng)態(tài)訪問(wèn)對(duì)象的類又沾,并從其類到該對(duì)象的詳細(xì)信息弊仪,比如繼承多態(tài)、反射捍掺。
但是凡事都有兩面性撼短,Java對(duì)象內(nèi)存占用的大小取決于它所包含的信息的總和,對(duì)象頭在 64 位系統(tǒng)上至少需要 16 個(gè)字節(jié)挺勿,在 32 位系統(tǒng)上至少需要 8 個(gè)字節(jié)(當(dāng)然JVM可以通過(guò)配置項(xiàng)去設(shè)置如何保存對(duì)象頭)蜓席。很多對(duì)象不需要多線程再榄,也不需要什么對(duì)象標(biāo)識(shí),就像上面提到的衣服的顏色,只有顏色的值才是我們關(guān)心的事昌执。這種冗余的內(nèi)存占用讓Java為人詬病。
Value Class
對(duì)于許多對(duì)象來(lái)說(shuō),它屬性值的相等性是我們關(guān)心的丧慈,其它類信息沒什么用馍迄,而且只為保存值和對(duì)這些值進(jìn)行操作而編寫的類在所有類中所占的比例非常大。Valhalla項(xiàng)目為這樣的場(chǎng)景引入了一個(gè)新的類類型:Value Class麦备。目前還只是JEP草案孽椰,但是已經(jīng)初具形態(tài):
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和我們常見的類差不多,但是它可能(這里依然在討論中)具有下面一些特性:
值對(duì)象是沒有身份的對(duì)象凛篙,通常情況下我們用
==
運(yùn)算符檢查身份黍匾,這里可能和equals()
不再有區(qū)別。值類本身和它的所有字段默認(rèn)都是
final
的呛梆。該類不直接或間接地實(shí)現(xiàn)
java.lang.IdentityObject
(有身份標(biāo)識(shí)類的新超類)锐涯。這意味著超類要么是無(wú)狀態(tài)抽象類,要么Object
是無(wú)狀態(tài)抽象類填物。值類都是
java.lang.ValueObject
的隱式實(shí)現(xiàn)纹腌。沒有構(gòu)造
super
函數(shù)調(diào)用構(gòu)造函數(shù)霎终。將在不執(zhí)行任何超類初始化代碼的情況下創(chuàng)建實(shí)例。無(wú)法在值類中使用
synchronized
關(guān)鍵字升薯。(可能)該類沒有聲明
finalize()
方法莱褒。(可能)構(gòu)造函數(shù)不使用
this
來(lái)設(shè)置構(gòu)造函數(shù)主體中的字段,或者可能在所有字段都明確內(nèi)存分配之后覆劈。
其它的操作和普通的類應(yīng)該差別不大保礼,但是要注意的是,JDK標(biāo)準(zhǔn)庫(kù)中的一些原有類如果被認(rèn)定為Value Class需要做兼容性處理责语。
value要成為保留字還是關(guān)鍵字炮障?
這不是全部
Value Class對(duì)Java類對(duì)象頭進(jìn)行了閹割,有利于降低Java的內(nèi)存消耗坤候,但是這不是Valhalla計(jì)劃的全部胁赢。對(duì)于這一部分過(guò)于超前的內(nèi)容,我寫起來(lái)其實(shí)是很有困難的白筹,構(gòu)思了好幾天智末,從場(chǎng)景出發(fā)來(lái)了解一門編程語(yǔ)言的設(shè)計(jì)有利于從根本提高自己。如果你想了解更多關(guān)于Valhalla的東西徒河,可以關(guān)注我系馆,我會(huì)繼續(xù)分享相關(guān)的知識(shí)。
關(guān)注公眾號(hào):碼農(nóng)小胖哥顽照,獲取更多資訊