簡體   English   中英

非最終的-不可變的類

[英]non final - immutable classes

我已閱讀並始終被告知不變類必須是final。 但我想知道是否有可能將一個非最終類的對象作為不變的對象。 在此鏈接中( 為什么要在Java中將一個不可變的類聲明為final? ),如果不可變的類方法是final並且不能被覆蓋,該怎么辦 並且,如果該類的所有成員都是最終成員,則該類的對象也可以是不可變的(除非它們引用了可變對象)。 請告訴我是否錯誤並打勾:)

如果可以擴展一個不可變的類(這意味着它不是最終的),則可以將可變屬性添加到子類中,這將使您的子類可變,因此基類也將是可變的,因為它可以具有可變性子類。

不可變的類不一定必須是最終的,但是您需要防止其被子類化,例如,通過沒有公共或受保護的構造函數。

例如,Guava的ImmutableList類不是最終的,但它是不可變的,如Javadoc中所述。

對於創建不可變類,將類標記為最終類不是強制性的。

讓我從Java類本身中獲取一個這樣的例子。“ BigInteger”類是不可變的,但不是最終的。

實際上,不變性是一個概念,根據該概念,創建的對象不能修改。

讓我們從JVM的角度考慮,從JVM的角度來看,所有線程都必須共享對象的相同副本,並且在任何線程訪問它之前,它都已完全構建,並且對象的狀態在其構建后不會改變。

不變性意味着一旦創建了對象就無法改變其狀態,這是通過三個經驗法則來實現的,這三個規則使編譯器認識到類是不變的,它們如下:

所有非私有字段都應為最終字段,請確保該類中沒有任何方法可以直接或間接更改該對象的字段,該類中定義的任何對象引用都不能在該類外部進行修改。有關更多信息,請參見網址下方

http://javaunturnedtopics.blogspot.in/2016/07/can-we-create-immutable-class-without.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM