簡體   English   中英

Guice無界通用綁定

[英]Guice unbounded generic binding

我想提供通用實例,而無需在模塊實現中明確說明通用參數。

假設我有一個非常優化的Map實現,希望每個人都可以使用它。

class MyVeryOptimizedHashMap<K, V> implements Map<K, V> {}

我知道,遵循用法並不是最佳的設計模式,但是出於示例的目的,這是一個有效的要求:

class SomeInjectee {
  @Inject
  private Map<String, Integer> myMap;
}

要將以下實例綁定到我選擇的提供程序,請執行以下模塊聲明:

class GenericMapModule extends AbstractModule {
  protected void configure() {
    bind(new TypeLiteral<Map<String, Integer>>() {}).toProvider(new TypeLiteral<Provider<MyVeryOptimizedHashMap<String, Integer>>>() {});
  }
}

問題是我必須明確聲明泛型類型參數,但我不可能對所有可能的類型都這樣做:

class SomeOtherInjectee{
  @Inject
  private Map<SomeUnknownKey, Long> myMap;
}

這解決了我的問題,但不是很優雅:

class GenericModule extends AbstractModule {
  protected void configure() {
    bind(new TypeLiteral<Map<?, ?>>() {}).toProvider(new Provider<Map<?,?>>() {
      public Map<?, ?> get() {
        return new MyVeryOptimizedHashMap();
      }
    });
  }
}

class SomeOtherInjectee {
  private Map<SomeUnknownKey, Long> myMap;

  @Inject
  void setMap(Map<?, ?> mapInstance) {
    myMap = (Map<SomeUnknownKey, Long>) mapInstance;
  }
}

我正在尋找的是這樣的:

class GenericModule extends AbstractModule {
  protected void configure() {
    bind(TypeLiteral.anyGenericVariant(Map.class)).toProvider(new TypeLiteral<Provider<MyVeryOptimizedHashMap>>(){});        
  }
}

如果適用於您的情況,請嘗試使用靜態實用程序方法。

class SomeOtherInjectee {
    private Map<SomeUnknownKey, Long> myMap = newOptimizedMap();

如果這不適用,那么如您所見,Guice在泛型方面非常精確,即每個泛型代表一個唯一的綁定。 因此anyGenericVariant實際上必須列出所有可能的變體,並提前進行綁定。 瘋。

在這種情況下,您可以使用TypeListener注冊自定義注入。 看起來像

class SomeOtherInjectee {
    @InjectOptimizedMap private Map<SomeUnknownKey, Long> myMap;

或您創建的任何自定義注入注釋。

有關完整示例和有關如何進行自定義注入的說明 ,請參見此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM