第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何使Map的特化變得不可修改?

如何使Map的特化變得不可修改?

DIEA 2023-06-28 15:51:56
我目前正在通過(guò)一個(gè)中型編碼示例來(lái)刷新我的 Java 知識(shí)。我有一個(gè)數(shù)據(jù)結(jié)構(gòu)Map<String, String>,通常用它來(lái)初始化它new LinkedHashMap<>()以保留插入順序。我在代碼中經(jīng)常使用它,并且我想擺脫聲明重復(fù)。在 C++ 中,我會(huì)給地圖起別名,但據(jù)我所知,在 Java 中沒(méi)有別名。所以我想出了將泛型子類(lèi)化的想法,如下所示:public class Attributes extends LinkedHashMap<String, String> {    public Attributes() {        super();    }    public Attributes(Map<? extends String, ? extends String> map) {        super(map);    }}到目前為止,這看起來(lái)不錯(cuò),但現(xiàn)在我想創(chuàng)建它的不可修改的副本,因?yàn)閷傩詰?yīng)該是不可變/不可修改的數(shù)據(jù)結(jié)構(gòu)的一部分。在我使用這個(gè)之前:Map<String, String> unmodifiableAttributes = Collections.unmodifiableMap(        new LinkedHashMap<>(attributes));這不適用于派生類(lèi),我嘗試過(guò):Attributes unmodifiableAttributes = Collections.unmodifiableMap(        new Attributes(attributes));編譯器會(huì)拒絕它Incompatible types。有沒(méi)有一種簡(jiǎn)單的方法來(lái)獲取此類(lèi)子類(lèi)的不可修改(或不可變)副本?還是我的想法完全錯(cuò)誤?我不想寫(xiě)一個(gè)功能齊全的裝飾器,只想寫(xiě)幾行代碼。更新到目前為止,對(duì)于我想做的事情似乎還沒(méi)有好的解決方案。我查看了Java Collections類(lèi)的源代碼,有不可修改的映射和類(lèi)似集合的內(nèi)部類(lèi)。它們用于包裝輸入集合并由相應(yīng)的靜態(tài)方法返回。人們可以重新實(shí)現(xiàn)這一點(diǎn),但我認(rèn)為開(kāi)銷(xiāo)太大。我們對(duì) LSP 違規(guī)進(jìn)行了更多討論,而不是原來(lái)的問(wèn)題,這確實(shí)也是一個(gè)有趣的問(wèn)題。
查看完整描述

2 回答

?
一只名叫tom的貓

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊

您不能使子類(lèi)LinkedHashMap不可修改,因?yàn)樗鼤?huì)違反里氏可替換性:LinkedHashMap被記錄為可變的,因此所有子類(lèi)也必須是可變的。

您還有一個(gè)額外的問(wèn)題,即要使地圖不可修改實(shí)際上需要做很多工作:您不僅有像putand之類(lèi)的明顯方法remove,而且還有像clear,?putAll,?putIfAbsent,?computeIfAbsent, 之類(lèi)的東西computeIfPresent。然后你必須擔(dān)心視圖返回方法:entrySet,keySet,values都必須返回不可修改的視圖。我確信我錯(cuò)過(guò)了幾個(gè)也需要重寫(xiě)的方法,但我的觀(guān)點(diǎn)仍然是,使可變映射不可修改并不是微不足道的。

但是,您可以擁有不可修改的 Map 實(shí)現(xiàn)。最簡(jiǎn)單的方法是擴(kuò)展AbstractMap并委托給實(shí)際的LinkedHashMap

public class Attributes extends AbstractMap<String, String> {

? ? private final LinkedHashMap<String, String> delegate;


? ? public Attributes() {

? ? ? ? this(Collections.emptyMap());

? ? }


? ? public Attributes(Map<? extends String, ? extends String> map) {

? ? ? ? this.delegate = new LinkedHashMap<>(map);

? ? }


? ? // Override the methods you need to, and that are required by AbstractMap.

? ? // Details of methods to override in AbstractMap are given in Javadoc.

}

但我也會(huì)質(zhì)疑你的 Attributes 類(lèi)是否真的需要實(shí)現(xiàn)像接口一樣通用的東西Map- 如果你需要這種通用性,你可以直接使用 a Map。


查看完整回答
反對(duì) 回復(fù) 2023-06-28
?
倚天杖

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊

Collections.unmodifiableMap返回 aMap<K,V>所以你必須像這樣使用它:

Map<String,?String>?unmodifiableAttributes?=?Collections.unmodifiableMap(?
???????????new?Attributes(attributes)
);

并且您無(wú)法將返回的對(duì)象轉(zhuǎn)換為Attributes

Attributes?unmodifiableAttributes?=?(Attributes)?Collections.unmodifiableMap(
????????????new?Attributes(attributes)
);

因?yàn)?code>Collections.unmodifiableMap返回實(shí)例,private static UnmodifiableMap所以你會(huì)得到一個(gè)ClassCastException.?并且Attributes不是 的子類(lèi)型UnmodifiableMap。

LinkedHashMap另外,我認(rèn)為在您的情況下,直接使用而不是從中創(chuàng)建派生類(lèi)會(huì)更容易,因?yàn)閾?jù)我所知,功能與原始類(lèi)沒(méi)有什么不同。Collections.unmodifiableMap然后使用從as返回的對(duì)象Map。


查看完整回答
反對(duì) 回復(fù) 2023-06-28
  • 2 回答
  • 0 關(guān)注
  • 255 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)