1

Roboguice(+ Guice)を使い始めたばかりですが、使い方のベストプラクティスがわかりません。

私のアクティビティには、「ProviderQueries」(シングルトン)というオブジェクトを使用する約5つの関数(約30個のうち)があります。私はそれを2つの方法で使うことができました:

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つの異なる関数でのみ必要です...

どのアプローチを使用しますか、それともより良い解決策がありますか?

前もって感謝します!

4

2 に答える 2

1

これはちょっとした判断の呼びかけです。私には、5つの関数は、これをメンバー変数に入れるのに十分な理由のように思えます。これは、よりクリーンな構文を使用し、インジェクターへの明示的な依存を減らします。30の方法すべてで使用されているわけではないというあなたの意見はわかりますが、それは私の個人的な意見では二次的な懸念のようです(もちろんあなた自身の美的感覚は異なるかもしれません)。

ProviderQueriesが特にメモリを大量に消費する場合、オプション1はアクティビティの期間中オブジェクトをライブに保つため、1ではなくオプション2を使用することを検討することをお勧めします。ほとんどのオブジェクトでは考慮されませんが、一部のオブジェクトでは問題になる可能性があります。

Guiceを使用していなかった場合、シングルトンにどのようにアクセスしますか?おそらくアクセサメソッドを介して?もちろん、シングルトンへのアクセスごとに発生する小さな反射オーバーヘッドを回避することはできませんが、よりコンパクトな方法で#2を実行する独自のアクセサーをいつでも作成できます。

于 2011-08-18T11:31:39.810 に答える
0

たぶん、Guiceのプロバイダークラスを使用する必要があります。

Guiceサイトの(簡略化された)例:

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

于 2012-04-21T18:35:34.650 に答える