java8 mixins “虛擬字段模式”實現“面向組合編程”

DCI(Data Context Interaction) 面向組合編程,一直是個比較高冷的概念。最近想實踐下,發現了一篇不錯的文章,翻譯一下。

先介紹下背景:

JAVA語言是單繼承的,所以實現“組合”總是比較繞的。總結下幾種實現方式:

  1. 實現多接口,具體的行爲和狀態通過代理實現。

  2. AOP/動態代理/其他字節碼織入

  3. JVM平臺下的其他語言特性,例如scala的Trait,Ruby的mixin

  4. 特定框架Apache Zest



java8 對接口做了語法上的增強來模擬mixin. 但是不能很好的處理狀態的繼承。總的來說還是上面第一種方案類似。不過省去了很多代理方法的轉發。


翻譯:我把這個稱爲"虛擬字段模式"(Virtual Field Pattern),這些類提供了get,set方法,並最終合併到一起。像這樣的帶狀態的混入,我也是剛有一些概要的想法,不知道有沒有其他更官方的最佳實踐,在我看來可以使用防禦性方法實現代理:

 interface Peeker<T> {
     T peek();
     T take();
     // maybe some other methods...
 }
 
 interface PeekerView<T> extends Peeker<T> {
     Peeker<T> getPeeker();
     
     T peek() default { return getPeeker().peek(); }
     T take() default { return getPeeker().take(); }
 }
 
 public class BagOTricks<T> implements PeekerView<T>, ListView<T>, SupplierView<T> {
     private List<T> underlying = ...
     private Peeker<T> peeker = new ListPeeker<T>(underlying);
     private Supplier<Optional<T>> supplier = new ListSupplier<T>(underlying);
 
     @Override
     public Peeker<T> getPeeker() {
         return peeker;
     }
 
     @Override
     public List<T> getList() {
         return underlying;
     }
 
     @Override
     public Supplier<Optional<T>> getOptionalSupplier() {
         return supplier;
     }
 }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章