2013-10-31 162 views
0

我很難搞清楚如何使用Guice綁定接口到枚舉。Guice,綁定枚舉

public interface Snack { 
    public int caloriesCount(); 
} 

public enum Chocolate implements Snack { 
    MILK(20), 
    DARK(5), 
    WHITE(10); 

    private int calCount; 

    private Chocolate(int calCount) { 
     this.calCount = calCount; 
    } 

    @Override 
    public int caloriesCount() { 
     return calCount; 
    } 
} 

如果我嘗試: bind(Snack.class).to(Chocolate.class);

我得到No implementation for Chocolate was bound

我明白,與其試圖綁定到我應該綁定到組枚舉的值的枚舉,但它違背了我如何才能完成。 欣賞任何提示。 謝謝, Maciek

回答

8

綁定到這樣的枚舉類是不可能的,因爲Guice不能創建它自己的實例。在這裏,默認行爲是創建一個Chocolate的新實例,這個實例沒有太大意義,並且Guice不會爲您選擇任意現有的實例。

你可能想要做的這三樣東西,而不是一個:

  1. 綁定Snack特定類型的Chocolate

    bind(Snack.class).toInstance(Chocolate.DARK); 
    
  2. 綁定SnackChocolate,和Chocolate於特定類型的Chocolate。這就像上面那樣,但是現在你可以直接詢問Chocolate並獲得一個實例,而不是隻能請求Snack

    bind(Snack.class).to(Chocolate.class); 
    bind(Chocolate.class).toInstance(Chocolate.DARK); 
    
  3. 允許開發者注入Set<Snack>,這恰好返回所有Chocolate實例。

    // manual wildcard required so we don't get an ImmutableSet<Chocolate> 
    Set<Snack> setOfSnacks = ImmutableSet.<Snack>copyOf(Chocolate.values()); 
    
    // bind a Set<Snack> specifically 
    bind(new TypeLiteral<Set<Snack>>() {}).toInstance(setOfSnacks); 
    

    您可以使用任何一組的實現,但是因爲所有toInstance綁定是隱含單身,你可以,如果你使用Guava's ImmutableSet或至少Collections.unmodifiableSet減少修改的一些風險。如果這與您想要的接近,您可能有興趣瞭解可選的Multibindings plugin

    當然,你也可以寫自己的Provider<Set<Snack>>或方法@Provides Set<Snack>,從而每次得到一組新的實例...但如果你希望使用這個在您的應用程序也可能更合理共享一個不可改變的副本。

+0

謝謝一堆。它的工作原理和我現在正在學習多重綁定。 – Maciek