2011-08-22 13 views
6

シングルトンを「悪い」と常に知っていましたが、今ではC++からJavaに移行したばかりです。読書の少しから、工場や依存性注入のいずれかが仕事をする可能性があることがわかりましたが、私はこれについていくつかの確認をしたいと思います。シングルトンの代わりに依存性注入を使用する

例として、私はMap<String, Animation>を格納するAnimationCacheシングルトンを書こうとしていました。異なるクラスは、簡単かつ効率的にアニメーションを読み込むことができるように、このクラス(基本的に)にアクセスできる必要があります。同等のコードがDIを使用しているように見えるのは、非常に簡単な例です。

また、Guiceは非ウェブアプリケーションとDIの良いフレームワークですか?私はWeb開発のためにSpringを使用しましたが、私はそれがゲームでうまくいくかどうかはわかりません。

+0

春のDIは、Webアプリケーション用ではありません。 – gtiwari333

+0

アップデート:[CDI 2.0 - Contexts&Dependency Injection for Java](http://cdi-spec.org)を検討することもできます。 2017-04現在の[JSR 365](https://jcp.org/ja/jsr/detail?id=365)で標準化されています。 *両方のJava SEとJava EE用に設計されています。 –

+0

この質問とその回答は、将来の読者に関連している可能性があります。https://stackoverflow.com/questions/130794/what-is-dependency-injection?rq=1 – Cypher

答えて

5

春とGuiceには罰金を行います。私は個人的に純粋な依存性注入のためにGuiceを好むが、Springはもっと多くを提供する。

コードはちょうどこのようになります。

public class AnimationCacheClient { 

    private AnimationCache cache; 

    @Autowired // for Spring, or 
    @Inject // for Guice (but I think Spring also supports it now) 
    public AnimationCacheClient(AnimationCache cache) { 
     this.cache = cache; 
    } 

    // ... 
} 

私はpersonnallyコンストラクタ・インジェクションを好むが、あなたはまた、セッター・インジェクションやフィールド注入を使用する場合があります。

DIの目的は「簡単なシングルトン」を持つことではないことに注意してください。その主な目的は、モックの依存関係(ここでは、モックAnimationCacheのインスタンス)を挿入できることにより、コード(AnimationCacheClient)を簡単にユニットエスケープにすることです。

+0

コードサンプルありがとうございます。そう簡単に見える。だから私はDependency InjectionがSingletonsの代わりになると仮定するのは間違っていたのですか?私は実際には、コードにアクセスするためのより良い方法を探しています。 – Mitch

+0

いいえ、あなたは間違っていませんでした。デフォルトでは、Spring Beanはシングルトンです。 Guice beanはデフォルトではプロトタイプですが、シングルトンとして構成されている可能性があります。私はDIの主な目標はシングルトンを簡単にすることではないことを指摘したがっています。その主な目的は、テストを容易にすることです。 –

1

私は最近、この「thread」をシングルトンに抱きしめ、それがいかに悪い(またはそうでないかもしれない)か、それをバイパスするために何ができるのかを評価しました。読書の価値がある。

関連する問題