2022年Java將有什么新的特性和改進,我相信很多Java開發者都想知道,結合Java語言架構師布萊恩·格茨(Brian Goetz)最近的一些分享,胖哥給大家爆個料,老規矩,點贊走起,
Valhalla
布萊恩·格茨在去年底發表了一篇名為State of Valhalla的文章,里面資訊量非常大,里面提到早在2014年Java專案組就啟動了一個名叫Valhalla的專案,這個專案將為JVM平臺帶來更加靈活的、扁平化的資料型別,在2021年該專案將有進一步的動作,值物件(value objects)、原始類(primitive classes)、專用泛型(specialized generics)即將引入JVM平臺,今天先來聊聊這個值物件是個啥,
我們知道什么是“值”,什么是“物件”,但是什么是“值物件”呢?不光你們懵逼,我也懵逼,來一起研究研究,
Java型別系統的不足

Java型別系統由內置的10種型別組成,這10種型別無法直接表達復雜的資料結構,例如字串、三維坐標、空間向量等等,但是開發者可以用這10種型別來為業務物體建模,Java的型別體系是非常有用的,
但是Java型別仍然存在“缺陷”, 同一個類的兩個物件包含完全相同的屬性,但是它們的記憶體尋址是不一樣的,

所以從某種意義上說,他們有自己的身份標識,
但是對于原始型別就不一樣了,如果一個int型別的變數值為7,另一個也為7,區分它們有意義嗎?這個7還是那個7?顯然是無意義的,
讓我們再來舉一個現實中的例子,兩件相同尺寸、材質的紅色衣服肯定是兩件不同的衣服,但是它們的材質肯定是一種材質,顏色肯定是一種顏色,不會有傻子認為這是兩種顏色,這里面的尺寸當然可以通過Java中的原始型別去描述,但是材質和顏色不行(雖然顏色可以用十六進制表示),這里的尺寸、材質、顏色都應該被認為是原語,
這個痛點促使了Valhalla專案的誕生,
物件頭
為了理解Valhalla引入的 Value Object / Class 和 Primitive Object / Class 概念能夠給我們帶來了什么,我們需要看看JVM是如何將物件保存在記憶體中的,

物件頭對類的物件非常重要,決定哪個執行緒可以訪問物件、垃圾收集器標記、物件hash;更重要的還有物件的型別指標,它能夠在運行時動態訪問物件的類,并從其類到該物件的詳細資訊,比如繼承多型、反射,
但是凡事都有兩面性,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的東西,可以關注我,我會繼續分享相關的知識,
關注公眾號:Felordcn 獲取更多資訊
個人博客:https://felord.cn
|
博主:碼農小胖哥 出處:felord.cn 本文著作權歸原作者所有,不可商用,轉載需要宣告出處,否則保留追究法律責任的權利,如果文中有什么錯誤,歡迎指出,以免更多的人被誤導, |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/415212.html
標籤:Java
上一篇:druid資料庫連接池的配置類
