亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Class 的實例是不可變的嗎?

Class 的實例是不可變的嗎?

忽然笑 2021-08-19 19:04:42
我想知道Class實例是否是不可變的。聲明的方法名稱并不表明實例狀態在調用時會發生更改,但我在 javadoc 上沒有發現明確的保證。場景:我需要將唯一的類名存儲在Set. 理想情況下,我想用Class實例填充集合,以避免Class.forName()在我需要通過反射訪問類時進行不必要的調用。但是,最好使用不可變對象作為集合的鍵。因此我想知道我是否可以立即使用Class實例。
查看完整描述

2 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

首先,泛型部分Class<?>在這里真的無關緊要。當然,沒有原始類型,因此Class<?>比 Class 更好,但是對于您的問題,通配符無關緊要。

所以本質上,您是在問 Class 對象是否不可變。出于所有實際目的,它們確實如此。

當類加載器加載一個類時,類對象就存在了,除非整個類加載器被卸載,并且所有的東西都被它加載,否則它們會一直存在。

當這樣的類對象仍在某處的地圖中使用時,這不會發生。

另一方面:Class.forName()對于已經加載的類不應該太昂貴。當諸如序列化之類的事情發揮作用時,人們建議使用 String 而不是 Class 對象,例如(參見此處)。

必須區分類對象的不可變標識和屬于該類的實際“代碼”。該代碼可以在運行時更改(通過檢測,想想代碼的熱交換)。但是類名及其每個代碼以及equals()相等性不應受此影響。因為“身份”保持不變。

最后一點:正如下面有趣的評論所示,有一些方法可以在一定程度上改變Class 對象。但所有這些活動都絕對是“不正常的”。因此:理論上,您可能更喜歡字符串而不是 Class 對象,但實際上,在“普通”應用程序中,使用 Class 也應該可以正常工作。


查看完整回答
反對 回復 2021-08-19
?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

因為我不太同意其他答案,所以我決定寫這個,
類不是一成不變的,但它們是唯一的 - 一個類只能存在一個 Class 對象的實例。

但是類不是由其名稱定義的,因為類可能來自不同的類加載器,并且不同的類加載器可能具有相同名稱的類 - 但那將是不同的類,ClassCastException如果您在由 2 處理的代碼之間傳遞一些對象,您會得到如果該對象類型存在于它們中(作為單獨的一個,而不是繼承的),則不同的類加載器。

類實例仍然可以安全地在 中使用Set,因為它們使用 hashset/equals 的默認實現,因此只有相同的實例Class才會被視為相等。

但是要決定是否應該使用String或者Class您需要知道您的應用程序應該如何工作,就像我說的那樣,不同的類加載器之間可以存在多個具有相同名稱的類。

并且通過僅存儲類名,您不能確定Class.forName會返回與預期相同的實例,它甚至可能從當前類加載器加載一些具有相同名稱的其他類,而不是使用預期的類。


查看完整回答
反對 回復 2021-08-19
  • 2 回答
  • 0 關注
  • 274 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號