2016-07-28 19 views
2

私は次のコードを持っています。これは、タイプのライターベースのインスタンスを取得するファクトリー関数のようなものです。種類はenumです。スイッチからのケース数を減らす

public Writer getWriter(WriterTypeEnum type){ 
    switch(type){ 
    case A: new AWriter() break; 
    case B: ... break; 
    case C: ... break; 
    ... 
    } 
} 

問題は約30 caseです。それを減らしたり、まったく実装しないために私は何ができますか?

戦略パターンを使用して過去にこのようなケースを解決しましたが、ここではアプリ全体で古いenumが使用されています。もう一つの問題は、私はこの列挙体に春の豆を入れることができないということです。スイッチケースのインスタンスの一部はbeanです。

WriterTypeEnumには、UIから送信されるIDがあり、そのIDに基づいて適切なインスタンスを判断する必要があります。

+2

あなたがここで求めていることは不明です。 switch文にすべての可能な場合を実装する必要はありません。あなたが明示的に扱いたくないものに対して 'default'を使うだけです。もう一つの選択肢は、enum自体が作家を作ることができるようにすることです - しかし、それについてもっと知ることなく、私たちは本当に分からないのです。 –

+1

Map を使用し、型を渡すことでオブジェクトを取得できます。これはあなたに役立つかもしれません:http://stackoverflow.com/questions/27993819/hashmap-vs-switch-statement-performance –

答えて

2

ライター名のルックアップマップを作成してから、リフレクションを使用してインスタンスを作成するのはどうですか?

文字列writerNameJustFound = mapOfWriters.get(type);

オブジェクトインスタンス= Class.forName(writerNameJustFound).newInstance();あなたはセットアップあなたの列挙型をすることができます

3

は例

public enum YourEnum{ 
    FIRST(){ 
     public Writer getWriter(){ 
      return null; 
     } 
    }, ... // other enums 

    public abstract Writer getWriter(); 

} 

ため、抽象メソッド

public abstract Writer getWriter(); 

その後、すべてのインスタンスがそのメソッドを実装する必要がありますを持っているか、休憩を省略することができあなたのスイッチでは、繰り返しの文がある場合

+0

私は既にいくつかのスプリングサービスの中で実装されたメソッドを持っています。春までにインスタンス化されていない人にとっては、あなたの方法が有効です。私の場合、両方のタイプの実装があり、enumにSpring Beanを挿入することはできません。 – tzortzik

+1

@tzortzik um、あなたはautowireすることはできませんが、私はあなたがアプリケーションコンテキストを取得し、タイプ別にBeanを見つけることができると思いますか?または彼らのアドバイスに従うことができます:stackoverflow.com/a/21119815/5070158;内部クラスに注入する。 – Sarief

0

これまでのソリューションはすべて歓迎されていて、おそらくいくつかは私のケースではうまくいくでしょう。

解決策は、Set<WriterMapping>という別のオブジェクトを作成することでした。このオブジェクトでは、私はWriterEnumTypeとその対応者Writerの値を格納します。

+0

まだあなたのコメントに私の答えを読んで:D – Sarief

1

私が遭遇する別のタイプの答えは、継承を使用することです。つまり、WriterTypeEnumをWriterTypeにすることです。

public Writer getWriter(WriterType type){ 
    return type.getWriter(); 
} 

こうすれば、WriterTypeの正しい子を渡すだけで、getWriter内のコードには絶対に触れることはありません。 問題は、そのような解決策が実装可能かどうかにかかわらず、文脈にあります。

+0

それは実装することは不可能です(または非常にハード)モデルが貧血 – Sarief

関連する問題