java 交替_Java 8:使用交替接口公开的类型安全地图生成器
java 交替
動態展示您的課程
當我還是Java新手時,我記得當時以為應該有一種方法可以刪除或隱藏我不想公開的類中的方法。 就像用private方法或類似方法覆蓋public方法一樣(哪種情況是不可能的,也不應該是不可能的)。 顯然,今天我們都知道,通過暴露
interface 。
杜克大學和斯派爾露出另一張樣子……
通過使用名為Alternating Interface Exposure的方案,我們可以動態地查看類的方法并輸入安全類型,以便同一類可以強制實施應該使用的模式。
讓我舉個例子。 假設我們有一個Map構建器,可以在構建實際Map之前先相繼添加鍵和值來調用它。 Alternating Interface Exposure方案使我們能夠確保調用key()方法和value()的次數完全相同,并且只有在存在該調用時, build()方法才可調用(例如在IDE中可見)。鍵和值一樣多。
我正在參與的開源項目Speedment中使用了Alternating Interface Exposure方案。 在Speedment中,例如,在構建類型安全的Tuple時使用該方案,隨后在向TupleBuilder添加元素之后將構建該類型安全的Tuple 。 這樣,如果我們編寫TupleBuilder.builder().add("Meaning of Life).add(42).build() ,我們可以獲得類型化的Tuple2<String, Integer> = {“生命的含義”,42} TupleBuilder.builder().add("Meaning of Life).add(42).build() 。
使用動態地圖生成器
我在以前的一些文章中(例如這里 )多次寫過關于Builder模式的文章,如果您不熟悉這個概念,我建議您在閱讀之前重新閱讀有關此問題的文章。
當前的任務是產生一個Map構建器,它使用許多上下文相關的接口動態地公開許多實現方法。 此外,構建器應在首次使用它們時“學習”其鍵/值類型,然后對其余條目實施相同類型的鍵/值。
這是一個示例,說明一旦開發人員如何在代碼中使用該構建器:
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();}}在上面的代碼中,一旦我們開始通過調用key(1)使用Integer,構建器將僅接受作為Integer實例的其他鍵。 值也是如此。 一旦我們調用value("one") ,就只能使用作為String實例的對象。 例如,如果嘗試寫入value(42)而不是value("two") ,我們將立即在IDE中看到錯誤。 同樣,當我們使用代碼完成功能時,大多數IDE:都將能夠自動選擇合適的候選對象。
讓我詳細說明一下:
初次使用
使用方法Maps.builder()創建構建器,返回的初始視圖允許我們調用:
調用了初始key(K key) ,該構建器的另一個視圖將顯示為僅公開:
注意,由于鍵和值的數量不同, build()方法不會在此狀態下公開。 編寫Map.builder().key(1) .build() ; 完全是非法的,因為沒有與key 1關聯的值。
后續用法
現在已經確定了鍵和值類型,構建器將根據要調用的key()或value()在顯示的兩個交替接口之間進行切換。 如果調用key() ,則公開value() ;如果調用value() ,則公開key()和build() 。
建造者
一旦確定類型,這是構建器使用的兩個交替接口:
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);}請注意,一個接口如何返回另一個接口,從而導致暴露的交替接口無限流動。 這是使用交替接口的實際構建器:
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();}}我們看到實現類實現了兩個交替接口,但僅根據調用key()或value()才返回其中一個。 我通過創建兩個初始幫助類來“欺騙”一點,這兩個初始幫助類負責尚未確定鍵和值類型的初始階段。 為了完整起見,下面還顯示了兩個“欺詐”類:
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);}}后面的類以與主構建器類似的方式工作,即InitialKeyBuilder返回InitialValueBuilder ,而InitialValueBuilder創建一個類型化的構建器,該生成器可以通過交替返回KeyBuilder或ValueBuilder來無限期使用。
結論
當您需要類的類型安全和上下文感知模型時,“ 交替接口暴露”方案很有用。 您可以使用此方案為您的課程制定和實施許多規則。 這些類的使用將更加直觀,因為上下文相關的模型及其類型一直傳播到IDE。 該模式還提供了更強大的代碼,因為在設計階段的早期就發現了潛在的錯誤。 我們將在編碼時看到潛在的錯誤,而不是失敗的測試或應用程序錯誤。
翻譯自: https://www.javacodegeeks.com/2016/03/java-8-type-safe-map-builder-using-alternating-interface-exposure.html
java 交替
總結
以上是生活随笔為你收集整理的java 交替_Java 8:使用交替接口公开的类型安全地图生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓手机万能驱动软件(安卓手机万能驱动)
- 下一篇: spring 启动加载数据_12个很棒的