日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于价值链的流程框架分类_基于价值的类

發(fā)布時間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于价值链的流程框架分类_基于价值的类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基于價值鏈的流程框架分類

在Java 8中,某些類在Javadoc中有一個小注釋,說明它們是基于值的類 。 其中包括簡短說明的鏈接,以及有關(guān)不使用它們的限制。 這很容易被忽略,如果這樣做,則可能會在將來的Java版本中以微妙的方式破壞代碼。 為了避免這種情況,我想在自己的文章中介紹基于價值的類,盡管我已經(jīng)在其他文章中提到了最重要的部分。

總覽

在詳細(xì)說明這些限制之前,本文將首先探討為什么存在基于值的類以及為什么限制了它們的使用(如果您不耐煩,請?zhí)链颂?)。 它將以關(guān)于FindBugs的注釋結(jié)束,不久便可以為您提供幫助。

背景

讓我們快速了解為什么引入了基于值的類以及JDK中存在的類。

他們?yōu)槭裁创嬖?#xff1f;

Java的未來版本很可能包含值類型。 我將在未來幾周內(nèi)寫他們( 所以 留 調(diào)整 ),并會在一些細(xì)節(jié)呈現(xiàn)出來。 盡管它們肯定有好處,但本博文未涉及這些好處,這可能會使限制顯得毫無意義。 相信我,他們不是! 或者不要相信我自己去看 。

現(xiàn)在,讓我們看看我已經(jīng)寫了些關(guān)于值類型的文章:

該想法的最大簡化是,用戶可以定義一種不同于類和接口的新型類型。 它們的主要特征是它們將不會通過引用(如類)來處理,而是通過值(如基元)來處理。 或者,正如Brian Goetz在他的介紹性文章《價值觀的狀態(tài)》中所說的那樣:

像類一樣的代碼,像int一樣工作!

重要的是要添加值類型將是不變的-就像今天的原始類型一樣。

在Java 8中,值類型之前是基于值的類 。 未來它們的精確關(guān)系尚不清楚,但可能與裝箱和拆箱原語(例如Integer和int )相似。

當(dāng)設(shè)計(jì)Optional時,現(xiàn)有類型與將來值類型之間的關(guān)系變得顯而易見。 在指定和記錄基于值的類的局限性時也是如此。

存在哪些基于價值的類?

這些都是我在JDK中找到的所有標(biāo)記為基于值的類:

  • java.util: 可選 , OptionalDouble , OptionalLong , OptionalInt
  • java.time: 持續(xù)時間 , 即時 , LOCALDATE的 , LocalDateTime , 本地時間 , MONTHDAY , OffsetDateTime , OffsetTime , 期間 , 年 , YearMonth , ZonedDateTime , 了zoneid , ZoneOffset
  • java.time.chrono: HijrahDate , JapaneseDate , MinguaDate , ThaiBuddhistDate

我無法保證此列表是完整的,因?yàn)槲覜]有找到列出所有列表的官方消息。

發(fā)布時間由杰里米·舒爾茨在CC-BY 2.0 。

此外,還有一些非JDK類應(yīng)該被認(rèn)為是基于值的,但不要這樣說。 一個例子是Guava的Optional 。 可以肯定的是,大多數(shù)代碼庫都將包含旨在基于值的類。

有趣的是,現(xiàn)有的拳擊類(如Integer , Double等)未標(biāo)記為基于值。 這樣做似乎是合乎需要的-畢竟它們都是此類的原型-但這樣做會破壞向后兼容性,因?yàn)樗鼘⑹古c新限制相抵觸的所有用途追溯無效。

Optional是新的,并且免責(zé)聲明在第1天到來。另一方面, Integer可能受到了無可救藥的污染,而且我敢肯定,如果Integer不再是可鎖定的,它將破壞重要的代碼(盡管我們可能會這樣認(rèn)為)練習(xí)。)

Brian Goetz – 2015年1月6日(格式化我的)

不過,它們非常相似,因此我們稱它們?yōu)椤皟r值至上”。

特點(diǎn)

在這一點(diǎn)上,還不清楚如何實(shí)現(xiàn)值類型,它們的確切屬性是什么以及它們?nèi)绾闻c基于值的類交互。 因此,對后者施加的限制不是基于現(xiàn)有要求,而是源自某些所需的值類型特征。 這些限制是否足以在將來與價值類型建立關(guān)系還不清楚。

話雖如此,讓我們繼續(xù)上面的引用:

在Java 8中,值類型之前是基于值的類 。 未來它們的精確關(guān)系尚不清楚,但可能與裝箱和拆箱原語(例如Integer和int )相似。 此外,編譯器可能會自由地在兩者之間進(jìn)行靜默切換以提高性能。 恰恰是,來回切換(即刪除并稍后重新創(chuàng)建引用)也禁止將基于身份的機(jī)制應(yīng)用于基于值的類。

像這樣實(shí)現(xiàn)的JVM無需跟蹤基于值的實(shí)例的身份,這可以帶來實(shí)質(zhì)性的性能改進(jìn)和其他好處。

身分識別

在這種情況下, 身份一詞很重要,因此讓我們仔細(xì)看看。 考慮一個可變對象,該對象會不斷更改其狀態(tài)(例如正在修改的列表)。 即使對象總是“看起來”不同,我們?nèi)匀粫f它是同一對象。 因此,我們區(qū)分對象的狀態(tài)和身份。 在Java中,狀態(tài)相等由equals (如果適當(dāng)實(shí)現(xiàn))和身份相等通過比較引用來確定。 換句話說,對象的標(biāo)識由其引用定義。

現(xiàn)在假設(shè)JVM將如上所述處理值類型和基于值的類。 在那種情況下,兩者都不會具有有意義的身份。 值類型將沒有一個開始,就像int一樣。 相應(yīng)的基于值的類僅僅是值類型的盒子,JVM可以隨意銷毀和隨意創(chuàng)建它們。 因此,盡管當(dāng)然有對單個盒子的引用,但不能完全保證它們將如何存在。

這意味著,即使程序員可以查看代碼并遵循在各處傳遞的基于值的類的實(shí)例,JVM的行為也可能有所不同。 它可能會刪除引用(從而破壞對象的標(biāo)識)并將其作為值類型傳遞。 如果是身份敏感操作,則可能會重新創(chuàng)建一個新引用。

關(guān)于身份,最好考慮基于值的類,例如整數(shù):談?wù)摗?3”( int )的不同實(shí)例毫無意義,談?wù)摗?11:42 pm”的不同實(shí)例也沒有意義( LocalTime )。

如果基于值的類的實(shí)例沒有標(biāo)識,則只能通過比較它們的狀態(tài)(通過實(shí)現(xiàn)equals來確定)來確定其equals 。 這具有重要的含義,即狀態(tài)相同的兩個實(shí)例必須完全可互換,這意味著用另一個實(shí)例替換一個這樣的實(shí)例必須不會產(chǎn)生任何明顯的影響。

這間接確定了應(yīng)將哪些內(nèi)容視為基于值的實(shí)例狀態(tài)的一部分。 所有類型為基本類型或其他基于值的類的字段都可以成為其一部分,因?yàn)樗鼈円部梢酝耆Q(所有“ 3”和“ 11:42 pm”的行為都相同)。 普通班比較棘手。 由于操作可能取決于它們的身份,因此如果基于vale的實(shí)例都引用相同但不相同的實(shí)例,則通常無法將它們交換。

例如,考慮鎖定String ,然后將其包裝在Optional 。 在其他地方,將使用相同的字符序列創(chuàng)建另一個String并將其包裝。 然后,這兩個Optionals不可互換,因?yàn)榧词顾鼈儼b相同的字符序列,這些String實(shí)例也不相同,并且一個充當(dāng)鎖,而另一個則不起作用。

嚴(yán)格解釋這意味著,基于值的類必須只考慮引用本身,而不是將引用字段的狀態(tài)包括在其自身的狀態(tài)中。 在上面的示例中,僅當(dāng)Optionals實(shí)際指向同一字符串時,才應(yīng)將其視為相等。

但是,這可能過于嚴(yán)格,因?yàn)楸仨殞o定的以及其他有問題的示例進(jìn)行某種程度的解釋。 強(qiáng)制基于值的類忽略諸如String和Integer類的“值-ish”類的狀態(tài)非常違反直覺。

值類型框

被計(jì)劃為值類型的框會增加一些其他要求。 如果不深入探討值類型,這些將很難解釋,因此我現(xiàn)在不再這樣做。

局限性

首先,需要注意的是,在Java 8中,所有限制都是純?nèi)斯さ摹?JVM并不了解這類類的第一件事,現(xiàn)在您可以忽略所有規(guī)則而不會出錯。 但這在引入值類型時可能會發(fā)生巨大變化。

正如我們在上面看到的,基于值的類的實(shí)例沒有保證的身份,在定義相等性方面的寬松程度較低,并且應(yīng)符合值類型框的預(yù)期要求。 這有兩個含義:

  • 該類必須相應(yīng)地構(gòu)建。
  • 該類的實(shí)例不得用于基于身份的操作。

這是Javadoc中所述限制的基礎(chǔ),因此可以將其分為對類的聲明和其實(shí)例的使用的限制。

申報(bào)地點(diǎn)

直接來自文檔(編號和格式編號):

基于值的類的實(shí)例:

  • 是最終的且不可變的(盡管可能包含對可變對象的引用);
  • 具有equals , hashCode和toString ,它們僅根據(jù)實(shí)例的狀態(tài)而不是根據(jù)其標(biāo)識或任何其他對象或變量的狀態(tài)來計(jì)算;
  • 不使用身份敏感的操作,例如實(shí)例之間的引用相等( == ),實(shí)例的身份哈希碼或?qū)嵗墓逃墟i上的同步;
  • 僅基于equals()而不是基于引用相等( == )被視為相等;
  • 沒有可訪問的構(gòu)造函數(shù),而是通過工廠方法實(shí)例化的,該方法對提交的實(shí)例的身份沒有任何承諾;
  • 在相等時可以自由替換,這意味著在任何計(jì)算或方法調(diào)用中互換equals()任意兩個實(shí)例x和y都不會在行為上產(chǎn)生任何可見的變化。
  • 通過上面討論的內(nèi)容,大多數(shù)這些規(guī)則都是顯而易見的。

    規(guī)則1的動機(jī)是基于價值的類,是價值類型的盒子。 出于技術(shù)和設(shè)計(jì)原因,這些必須是最終的且不可更改,并將這些要求轉(zhuǎn)移到其包裝盒中。

    規(guī)則2 模糊地解決了有關(guān)如何定義基于值的類的狀態(tài)的問題。 規(guī)則的精確效果取決于對“實(shí)例狀態(tài)”和“任何其他變量”的解釋。 讀取它的一種方法是在狀態(tài)中包括“值-ish”類,并將典型的引用類型視為其他變量。

    3號到6號表示缺少的身份。

    有趣的是, Optional打破了規(guī)則2,因?yàn)樗诎b后的值上調(diào)用了equals 。 同樣, java.time和java.time.chrono所有基于值的類都通過可序列化(這是基于身份的操作,請參見下文) java.time.chrono破壞規(guī)則3。

    使用網(wǎng)站

    再次從文檔中:

    如果程序嘗試直接通過引用相等性或通過呼吁同步,身份哈希,序列化或任何其他身份敏感機(jī)制間接地將兩個引用區(qū)分為基于值的類的相等值,則可能會產(chǎn)生不可預(yù)測的結(jié)果。

    考慮到缺少的身份,直接區(qū)分參考是不言而喻的。 但是,沒有解釋為什么列出的示例違反了該規(guī)則,所以讓我們仔細(xì)看看。 我列出了所有可以解決的違規(guī)事項(xiàng),并提供了簡短的解釋和具體案例( vbi代表基于值的類的實(shí)例 ):

    參考比較:這顯然根據(jù)實(shí)例的身份來區(qū)分實(shí)例。

    vbi的序列化:希望使值類型可序列化,并且有意義的定義似乎很簡單。 但是,今天,序列化對對象身份做出了承諾,這與基于身份的無價值類的概念相沖突。 在其當(dāng)前實(shí)現(xiàn)中,序列化在遍歷對象圖時還使用對象標(biāo)識。 因此,目前,必須將其視為基于身份的操作,應(yīng)避免使用。

    情況:

    • 可序列化類中的非臨時字段
    • 通過ObjectOutputStream.writeObject直接序列化

    鎖定vbi:使用對象標(biāo)頭訪問實(shí)例的監(jiān)視器–基于值的類的標(biāo)頭可以自由刪除和重新創(chuàng)建,并且基本/值類型沒有標(biāo)頭。

    情況:

    • 在同步塊中使用
    • 調(diào)用Object.wait,Object.notify或Object.notifyAll

    身份哈希碼:要求該哈希碼在實(shí)例的生存期內(nèi)保持不變。 由于基于價值的類的實(shí)例可以自由刪除并重新創(chuàng)建,因此從某種意義上說,對于開發(fā)人員而言,恒定性是無法保證的。

    情況:

    • System.identityHashCode的參數(shù)
    • 鍵入IdentityHashMap

    突出顯示其他違規(guī)或?qū)φf明進(jìn)行改進(jìn)的評論將不勝感激!

    查找錯誤

    當(dāng)然,了解所有這些是很好的,但這并不意味著可以阻止您超越規(guī)則的工具并不會真正有用。 作為FindBugs的重度用戶,我決定要求項(xiàng)目實(shí)施此功能,并創(chuàng)建了功能請求 。 該票證涵蓋了使用站點(diǎn)的限制,并將幫助您在JDK以及您自己的基于值的類(帶有注釋的類)中維護(hù)它們。

    由于對FindBugs感到好奇,并且想要做出貢獻(xiàn),我決定著手嘗試自己實(shí)施它。 因此,如果您要問為什么花這么長時間準(zhǔn)備好該功能,現(xiàn)在您知道了:這是我的錯。 但是談話很便宜,所以為什么不加入我的行列呢? 我在GitHub上放置了一個FindBugs克隆 ,您可以看到此pull請求中的進(jìn)度。

    一旦完成,我計(jì)劃也要實(shí)現(xiàn)聲明站點(diǎn)的規(guī)則,因此可以確保在值類型最終出現(xiàn)時正確編寫并準(zhǔn)備好基于值的類。

    反射

    我們已經(jīng)看到,基于值的類是值類型的先驅(qū)。 隨著Java的變化,這些實(shí)例將沒有有意義的身份,并且定義它們的狀態(tài)的可能性也將有限,這將對其聲明和使用產(chǎn)生限制。 這些限制已詳細(xì)討論。

    翻譯自: https://www.javacodegeeks.com/2015/02/value-based-classes.html

    基于價值鏈的流程框架分類

    總結(jié)

    以上是生活随笔為你收集整理的基于价值链的流程框架分类_基于价值的类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。