java ImmutableMap的使用說明
java中的Immutable對(duì)象:
簡單地說,如果一個(gè)對(duì)象實(shí)例不能被更改就是一個(gè)Immutable的對(duì)象,Java SDK提供的大量值對(duì)象,比如String等都是Immutable的對(duì)象。
創(chuàng)建ImmutableMap:
Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>().build();
在創(chuàng)建時(shí)放值:
Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>() .put('k1','v1') .put('k2','v2') .build();
創(chuàng)建后不可變:
immutableMap.put('k1','v3');//會(huì)拋出java.lang.UnsupportedOperationExceptionImmutableMap中key和value均不能為null,放入null值會(huì)拋出NPE
ImmutableMap的使用場景:
適合
1、確定性的配置, 比如根據(jù)不同的key值得到不同的請(qǐng)求url
2、寫單元測試
不適合
1、key, value為未知參數(shù), 可能有null產(chǎn)生的情況
guava中ImmutableMap使用示例及好處ImmutableMap是不可變的,線程安全的;它可以創(chuàng)建一些常量的映射鍵值對(duì);他提供了很多的組合鍵值對(duì)的方法,源碼中使用了一個(gè)靜態(tài)內(nèi)部類來組裝構(gòu)建ImmutableMap,靜態(tài)內(nèi)部類作為外部類的輔助構(gòu)建ImmutableMap,內(nèi)部使用final聲明了一個(gè)ArrayList變量。
public static class Builder<K, V>{ final ArrayList<Map.Entry<K, V>> entries = Lists.newArrayList(); public Builder() {} public Builder<K, V> put(K key, V value) { this.entries.add(ImmutableMap.entryOf(key, value)); return this; } public Builder<K, V> put(Map.Entry<? extends K, ? extends V> entry) { K key = entry.getKey(); V value = entry.getValue(); if ((entry instanceof ImmutableEntry)) {Preconditions.checkNotNull(key);Preconditions.checkNotNull(value);Map.Entry<K, V> immutableEntry = entry;this.entries.add(immutableEntry); } else {this.entries.add(ImmutableMap.entryOf(key, value)); } return this; } public Builder<K, V> putAll(Map<? extends K, ? extends V> map) { this.entries.ensureCapacity(this.entries.size() + map.size()); for (Map.Entry<? extends K, ? extends V> entry : map.entrySet()) {put(entry.getKey(), entry.getValue()); } return this; } public ImmutableMap<K, V> build() { return fromEntryList(this.entries); } private static <K, V> ImmutableMap<K, V> fromEntryList(List<Map.Entry<K, V>> entries) { int size = entries.size(); switch (size) { case 0: return ImmutableMap.of(); case 1: return new SingletonImmutableBiMap((Map.Entry)Iterables.getOnlyElement(entries)); } Map.Entry<?, ?>[] entryArray = (Map.Entry[])entries.toArray(new Map.Entry[entries.size()]); return new RegularImmutableMap(entryArray); } }
之前我們判斷取值結(jié)果可以使用if else形式:
int a = 1;if(a == 1) { System.out.println(a);} else { System.out.println(a);}
或者使用switch方式:
int a = 1;switch (a) {case 1: System.out.println(a); break;case 2: System.out.println(a);default: System.out.println(a); break;}
現(xiàn)在可以使用ImmutableMap集合來組裝鍵值對(duì),這樣的組合方式既簡單又省去了大量多余的代碼:
ImmutableMap<String, Object> map = ImmutableMap .<String, Object>builder() .put('1', '1') .put('2', '2') .put('3', '3') .build();
ImmutableMap<String, String> map1 = ImmutableMap .<String, String>of('1', '2');
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. python爬蟲實(shí)戰(zhàn)之制作屬于自己的一個(gè)IP代理模塊2. 基于javaweb+jsp實(shí)現(xiàn)企業(yè)財(cái)務(wù)記賬管理系統(tǒng)3. .NET6打包部署到Windows Service的全過程4. 解決ajax請(qǐng)求后臺(tái),有時(shí)收不到返回值的問題5. HTML 絕對(duì)路徑與相對(duì)路徑概念詳細(xì)6. Python編寫nmap掃描工具7. Ajax返回值類型與用法實(shí)例分析8. .Net Core和RabbitMQ限制循環(huán)消費(fèi)的方法9. 使用FormData進(jìn)行Ajax請(qǐng)求上傳文件的實(shí)例代碼10. 如何在jsp界面中插入圖片
