類似DDD的值物件的Java中新的值型別ValueType -jaxenter
值型別與普通型別物件的不同之處在於:值型別沒有物件標頭或標識,沒有對值型別的引用,值型別是不可變的,並且值型別之間沒有繼承,因此,它沒有多型性。是不是非常類似DDD的值物件?
沒有標識
類似原始變數型別byte,char,short,int,long,float,double或者Boolean,沒有任何標識,不像普通物件都有標識,需要使用equals()方法去比較它們。
沒有引用
值儲存在變數中,而不儲存在堆heap中。當將值型別作為引數傳遞給方法時,該方法將接收原始值型別的“副本”,這是因為Java通過值而不是通過引用傳遞所有引數。隨著值型別的引入,這不會改變。將值型別作為引數傳遞給方法呼叫時,該值型別的所有位都將複製到該方法的本地引數變數中。
沒有物件頭部
由於值型別是值,儲存在變數中而不是堆中,因此它們不需要標頭。編譯器僅知道變數的型別,程式應以何種方式處理該變數中的bit位即可。類似原始型別一樣,當我們建立一個值型別的陣列時,這些值將一個接一個地包裝在記憶體中。這意味著對於值型別,我們將不會遇到物件陣列所具有的問題。沒有對陣列中各個元素的引用,它們不能分散在記憶體中。當CPU載入第一個元素時,它將載入同一記憶體頁面上的所有元素,並且訪問連續元素將利用處理器快取的優勢。
沒有繼承
值型別之間可能存在繼承,但是編譯器將很難管理它,並且不會帶來很多好處。我敢說允許繼承不僅會給編譯器造成問題,還會誘使沒有經驗的程式設計師建立弊大於利的構造。在即將釋出的支援值型別的Java版本中,值型別之間或類與值型別之間將沒有繼承。這是一個設計決策。
沒有多型
由於沒有繼承,因此不能有值型別多型性。但是,還有更多的原因表明對值型別實現多型是不合理的。
不變性
不變性是設計決定,但這是自然的方式。Java中的值型別是不可變的。不變性通常是一件好事。不可變物件有很大的幫助,在清潔和執行緒安全的方式編碼。不變性並不能解決所有的問題,但很多時候更是得心應手。
如果您考慮int作為一個數字,很明顯您不能更改其值。如果變數保留整數值2,則可以更改儲存在變數中的值,但不能將值本身更改為3。
您可以更改儲存值型別的變數的內容,但不能更改值型別本身。當您更改某個位時,實際上,根據哲學,您建立了一個新的值型別並儲存了新值來代替舊值。
不變性是一種特性,它與不能引用值型別這一事實密切相關。從理論上講,Java可以允許我們修改值型別的欄位。結果本質上是相同的:我們獲得了不同的值。這樣,在值型別的情況下不變性不受限制。這僅取決於我們如何編寫程式以及如何考慮值型別。將它們視為諸如數字之類的價值,本質上是不變的,被認為是一種健康的思維方式。
玩耍
在JEP 169下的Valhalla專案中,正在為Java開發值型別。目前,有一個早期訪問版本可以嘗試。此版本是Java 11版本的Java分支,並且有一些限制。您可以下載早期訪問版本。JEP主頁是https://openjdk.java.net/jeps/169,您可以從https://jdk.java.net/valhalla/下載EA版本。
您可以嘗試使用Eclipse,IntelliJ或記事本來編輯原始碼,但至少在IntelliJ 2019.EA版中,我無法構建程式碼。即使該程式碼是Java 11的原始碼,IntelliJ仍將其識別為Java 13,這順便說一句,暗示了我們可以期望發行版本中的值型別。可以手動執行命令列javac命令,然後手動java啟動JVM命令來完成程式碼的編譯。即使我對Maven的瞭解比對ANT的熟悉,我仍可以設法與IntelliJ提取的ANT指令碼相處。
總結
Java發展迅速。在過去的兩年中出現了許多新事物,並且正在醞釀中的許多新事物將在未來提供。值型別功能是其中之一。本文介紹了此功能的主要特徵,並簡要介紹了這項新技術。Java還是一種主要的程式語言,也許它是在專業環境中僅次於COBOL的第二廣泛使用的程式語言。
更詳細情況點選標題見原文。
相關文章
- TypeScript如何實現DDD的值物件?TypeScript物件
- DDD值物件:被遺忘的價值 – SoftwareMill Tech Blog物件REM
- 向banq老師請教:ddd中的值物件物件
- DDD的實體、值物件、聚合根的基類和介面:設計與實現物件
- 如何使用Java泛型對映不同的值型別Java泛型型別
- 值型別與引用型別的區別型別
- 從DDD中實體和值物件的逆向思考想到的物件
- C# 物件比較(值型別、引用型別)C#物件型別
- DDD中實體與值物件是幹什麼的物件
- C#的型別——值型別與引用型別C#型別
- 淺析number型別的值型別
- swift的值型別與inoutSwift型別
- 值型別Java庫包AutoValue型別Java
- 多型中的返回值型別多型型別
- 從原始資料型別到值物件資料型別物件
- php之普通變數賦值、物件賦值、引用賦值的區別PHP變數賦值物件
- [JS高程] 特殊的原始值型別JS型別
- 判斷值的資料型別資料型別
- char型別的數值轉換型別
- Swift 中的值型別與引用型別使用指北Swift型別
- DDD實體值物件的equals和hashcode方法實現 - wimdeblauwe物件
- 動態賦值弱型別值物件--Dynamic Create Value Object 模式 (轉)賦值型別物件Object模式
- 值型別和引用型別型別
- 值型別與引用型別型別
- Java 中賦值類時候修改後原類中的值改變Java賦值
- 從賦值看基本型別和引用型別的區別賦值型別
- Python引用型別和值型別的區別與使用Python型別
- input的type值型別和描述-HTML型別HTML
- swift值型別的執行緒安全Swift型別執行緒
- 軟體有兩種型別的值型別
- 基本資料型別和引用型別的初始值資料型別
- 類的域(field ,資料成員)是基本型別時的預設值型別
- 對於返回值型別不確定的函式如何限定返回值型別型別函式
- golang中 值型別,指標,引用的區別Golang型別指標
- js中的typeof返回值的所有型別JS型別
- TreeSet的null值與元素型別的約束Null型別
- 對值物件的理解物件
- 實戰 Java 16 值型別 Record - 2. Record 的基本用法Java型別