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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java 8:使用交替接口公开的类型安全地图生成器

發(fā)布時(shí)間:2023/12/3 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 8:使用交替接口公开的类型安全地图生成器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

動(dòng)態(tài)展示您的課程

當(dāng)我是Java新手時(shí),我記得當(dāng)時(shí)想過應(yīng)該有一種方法可以刪除或隱藏我不想公開的類中的方法。 就像用private方法或類似方法覆蓋public方法一樣(哪種情況是不可能的,也不應(yīng)該是不可能的)。 顯然,今天,我們都知道,通過暴露
interface 。

公爵和尖頂露出另一種樣子……

通過使用名為Alternating Interface Exposure的方案,我們可以動(dòng)態(tài)查看類的方法并輸入安全類型,以便同一類可以強(qiáng)制實(shí)施應(yīng)該使用的模式。

讓我舉個(gè)例子。 假設(shè)我們有一個(gè)Map構(gòu)建器,可以在構(gòu)建實(shí)際Map之前先相繼添加鍵和值來調(diào)用它。 Alternating Interface Exposure方案使我們能夠確保調(diào)用key()方法和value()的次數(shù)完全相同,并且只有在存在該調(diào)用時(shí), build()方法才可調(diào)用(例如在IDE中可見)。鍵和值一樣多。

我正在參與的開源項(xiàng)目Speedment中使用了Alternating Interface Exposure方案。 在Speedment中,例如,在構(gòu)建類型安全的Tuple時(shí)使用該方案,隨后在向TupleBuilder添加元素之后將構(gòu)建該類型安全的Tuple 。 這樣,如果我們編寫TupleBuilder.builder().add("Meaning of Life).add(42).build() ,我們可以得到類型化的Tuple2<String, Integer> = {“生命的含義”,42} TupleBuilder.builder().add("Meaning of Life).add(42).build() 。

使用動(dòng)態(tài)地圖生成器

我在以前的一些文章中(例如這里 )多次寫過關(guān)于Builder模式的文章,如果您不熟悉這個(gè)概念,我鼓勵(lì)您在閱讀之前重新閱讀有關(guān)此問題的文章。

當(dāng)前的任務(wù)是產(chǎn)生一個(gè)Map構(gòu)建器,它使用許多上下文相關(guān)的接口動(dòng)態(tài)地公開許多實(shí)現(xiàn)方法。 此外,構(gòu)建器應(yīng)在首次使用它們時(shí)“學(xué)習(xí)”其鍵/值類型,然后對(duì)其余條目實(shí)施相同類型的鍵/值。

這是一個(gè)示例,說明一旦開發(fā)人員如何在代碼中使用該構(gòu)建器:

public static void main(String[] args) {// Use the type safe builderMap<Integer, String> map = Maps.builder().key(1) // The key type is decided here for all following keys.value("One") // The value type is decided here for all following values.key(2) // Must be the same or extend the first key type.value("Two") // Must be the same type or extend the first value type.key(10).value("Zehn'") // And so on....build(); // Creates the map!// Create an empty mapMap<String, Integer> map2 = Maps.builder().build();}}

在上面的代碼中,一旦我們開始通過調(diào)用key(1)使用Integer,構(gòu)建器將僅接受作為Integer實(shí)例的其他鍵。 值也是如此。 一旦我們調(diào)用value("one") ,就只能使用作為String實(shí)例的對(duì)象。 例如,如果嘗試寫入value(42)而不是value("two") ,我們將立即在IDE中看到錯(cuò)誤。 另外,當(dāng)我們使用代碼完成功能時(shí),大多數(shù)IDE:都將能夠自動(dòng)選擇合適的候選對(duì)象。

讓我詳細(xì)說明一下:

初次使用

該構(gòu)建器是使用Maps.builder()方法創(chuàng)建的,返回的初始視圖允許我們調(diào)用:

  • build()生成一個(gè)空的Map (如上面的第二個(gè)“空地圖”示例)
  • key(K key) ,該密鑰將密鑰添加到構(gòu)建器并確定所有后續(xù)密鑰的類型(= K)(例如上述key(1) )
  • 一旦調(diào)用了初始key(K key) ,該構(gòu)建器的另一個(gè)視圖將顯示為僅公開:

  • value(V value) ,它向構(gòu)建器添加一個(gè)值,并為所有后續(xù)值(如value("one") )決定類型(= V)
  • 注意,由于鍵和值的數(shù)量不同, build()方法不會(huì)在此狀態(tài)下公開。 編寫Map.builder().key(1) .build() ; 完全是非法的,因?yàn)闆]有與key 1關(guān)聯(lián)的值。

    后續(xù)用法

    現(xiàn)在已經(jīng)確定了鍵和值類型,構(gòu)建器將根據(jù)要調(diào)用的key()或value()在顯示的兩個(gè)交替接口之間進(jìn)行切換。 如果調(diào)用key() ,則公開value() ;如果調(diào)用value() ,則公開key()和build() 。

    建造者

    一旦確定類型,這是構(gòu)建器使用的兩個(gè)交替接口:

    public interface KeyBuilder<K, V> {ValueBuilder<K, V> key(K k);Map<K, V> build();}public interface ValueBuilder<K, V> {KeyBuilder<K, V> value(V v);}

    請(qǐng)注意,一個(gè)接口如何返回另一個(gè)接口,從而導(dǎo)致暴露的交替接口無限流動(dòng)。 這是使用交替接口的實(shí)際構(gòu)建器:

    public class Maps<K, V> implements KeyBuilder<K, V>, ValueBuilder<K, V> {private final List<Entry<K, V>> entries;private K lastKey;public Maps() {this.entries = new ArrayList<>();}@Overridepublic ValueBuilder<K, V> key(K k) {lastKey = k;return (ValueBuilder<K, V>) this;}@Overridepublic KeyBuilder<K, V> value(V v) {entries.add(new AbstractMap.SimpleEntry<>(lastKey, v));return (KeyBuilder<K, V>) this;}@Overridepublic Map<K, V> build() {return entries.stream().collect(toMap(Entry::getKey, Entry::getValue));}public static InitialKeyBuilder builder() {return new InitialKeyBuilder();}}

    我們看到實(shí)現(xiàn)類實(shí)現(xiàn)了兩個(gè)交替接口,但是僅根據(jù)調(diào)用key()或value()才返回其中一個(gè)接口。 我通過創(chuàng)建兩個(gè)初始幫助類來“欺騙”一點(diǎn),這兩個(gè)初始幫助類負(fù)責(zé)尚未確定鍵和值類型的初始階段。 為了完整起見,下面還顯示了兩個(gè)“欺詐”類:

    public class InitialKeyBuilder {public <K> InitialValueBuilder<K> key(K k) {return new InitialValueBuilder<>(k);}public <K, V> Map<K, V> build() {return new HashMap<>();}}public class InitialValueBuilder<K> {private final K k;public InitialValueBuilder(K k) {this.k = k;}public <V> KeyBuilder<K, V> value(V v) {return new Maps<K, V>().key(k).value(v);}}

    后面的類以與主構(gòu)建器類似的方式工作,即InitialKeyBuilder返回InitialValueBuilder ,而InitialValueBuilder創(chuàng)建一個(gè)類型化的構(gòu)建器,該生成器可以通過交替返回KeyBuilder或ValueBuilder來無限期使用。

    結(jié)論

    當(dāng)您需要類的類型安全和上下文感知模型時(shí),“ 交替接口暴露”方案很有用。 您可以使用此方案為您的類制定和實(shí)施許多規(guī)則。 這些類的使用將更加直觀,因?yàn)樯舷挛南嚓P(guān)的模型及其類型一直傳播到IDE。 該模式還提供了更強(qiáng)大的代碼,因?yàn)樵谠O(shè)計(jì)階段就很早就發(fā)現(xiàn)了潛在的錯(cuò)誤。 我們將在編碼時(shí)看到潛在的錯(cuò)誤,而不是失敗的測(cè)試或應(yīng)用程序錯(cuò)誤。

    翻譯自: https://www.javacodegeeks.com/2016/03/java-8-type-safe-map-builder-using-alternating-interface-exposure.html

    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的Java 8:使用交替接口公开的类型安全地图生成器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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