2011-08-18 60 views
1

我剛開始使用Roboguice(+ Guice),我不確定如何使用它的最佳實踐。Roboguice/getInstance +最佳實踐

在我的活動中,我使用了一個名爲「ProviderQueries」(Singleton)的對象,它有大約5個函數(大約30個)。我可以以兩種方式使用它:

1)

protected void onResume() { 
     super.onResume(); 
     getInjector().getInstance(ProviderQueries.class).setLanguage("EN"); 
} 

2)

class MyActivity extends RoboActivity { 
    @Inject 
    private ProviderQueries pv; 

    ... 

     protected void onResume() { 
      super.onResume(); 
      pv.setLanguage("EN"); 
      }   
} 

1 - 太長,但使用ProviderQueries的實例在需要的地方
2 - 短而好,但「pv」可用於整個活動,但只需要5個不同的功能...

你會使用哪種方法,或者你有一個解決方案?

在此先感謝!

回答

1

這是一個判斷呼叫。對我來說,5個函數似乎有足夠的理由將它放在一個成員變量中,該成員變量使用更簡潔的語法並減少了對注入器的顯式依賴。我認爲你的觀點並非在所有的30種方法中都使用過,但我個人認爲這似乎是次要的問題(當然,你自己的審美觀可能不同)。

如果ProviderQueries特別是內存密集型,您可能需要考慮使用選項2而不是1,因爲選項1將使對象在活動期間保持活動狀態。不是大多數物體的考慮,但可能是一些問題。

如果你不使用Guice,你將如何訪問你的單身人士?大概通過訪問器方法?當然,您可以始終以更緊湊的方式編寫自己的訪問器來爲您執行#2,儘管它不會繞過每次訪問單例時產生的小反射開銷。

+0

我用ProviderQuery.getInstance()(PQ之前被實施爲單件-廠)。 ProviderQuery只是Provider-Requests的一個助手類。我的問題主要是設計問題。通常我會嘗試儘可能靠近需要的對象來使用它們。 –

0

也許你需要使用Guice的Provider類。

對於來自吉斯位點的(simlpified)例如:

public class RealBillingService implements BillingService { 
    private final Provider<CreditCardProcessor> processorProvider; 

    @Inject 
    public RealBillingService(Provider<CreditCardProcessor> processorProvider) { 
    this.processorProvider = processorProvider; 
    } 

    public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard) { 
    CreditCardProcessor processor = processorProvider.get(); 

    /* use the processor and transaction log here */ 
    } 
} 

提供商將隱藏的範圍和重量輕。它們可以在初始注入時保存在內存中,但不會引用您正在使用的具體對象。

文檔的這一點,與更多的例子: http://code.google.com/p/google-guice/wiki/InjectingProviders