2017-06-20 3 views
0

によって「ダイナミックで... ...その実装されている、私は次のコードを置き換えることが可能であるかどうかを知りたいストレージのインタフェースとStorageXXであることを知ってダイナミックコンストラクタ

Storage storage; 
switch (storageType) { 
    case "list": 
     storage = new StorageList(); 
     break; 
    case "map": 
     storage = new StorageMap(); 
     break; 
    case "db": 
     storage = new StorageDB(); 
     break; 
    default: 
     throw new UnsupportedStorageTypeException(); 
} 

をスイッチを交換String型のパラメータ(storageType)を受け取ったStorageのコンストラクタは、それぞれの場合に必要なインスタンスを返します。

Storageが抽象クラスである必要はありません。

可能であれば、switch文を避ける方が好きです。

+1

[Javaのクラス名からクラスオブジェクトを取得する方法](https://stackoverflow.com/questions/1438420/how-to-get-a-class-object-from-the-class)の可能な複製-name-in-java) – UnholySheep

+0

'StorageDB'の名前を' StorageDb'に変更した場合、名前を動的に構築し、リフレクションを使用することができます。 – Andreas

+0

別の質問からの[この回答](https://stackoverflow.com/a/29220300/6893866)はあなたのニーズに十分に合っていますか? (Java 8が必要) – Tezra

答えて

1

あなたはそのためのファクトリパターンを使用することができます。

class StorageFactory 
{ 
    public static Storage getStorage(String type) 
    { 
    if (type.equals("list")) 
     return new StorageList(); 
    else if (type.equals("map")) 
     return new StorageMap(); 
    else if (type.equals("db")) 
     return new StorageDb(); 

    throw new IllegalArgumentException(); 
    } 
} 

とストレージリストを作成する:

Storage storage = StorageFactory.getStorage("list"); 
+0

あなたは 'switch'ステートメントを複数の' if'ステートメントで置き換えました。どのように違うのですか? – Andreas

+0

まあ、私は彼が 'if'ステートメントではなく' switch'ステートメントに対して何かを持っていることを理解しており、私は彼にパターンを提示します。私はそれに投票するに値するとは思わないが、それは大丈夫だ。 – Dherik

+0

@Dherikと同意します。私は「できるだけスイッチを避ける」と言っているので、あなたはdonwvoteに値しません。これはちょうど私があなたに感謝する必要があります – Arcones

0

あなたはクラスに

Map<String, Class<? extends Storage>> map = new HashMap<>(); 
map.put("list", StorageList.class); 
map.put("map", StorageMap.class); 
map.put("db", StorageDB.class); 

をstorageTypeからマップを作成し、Classを経由して、インスタンスを使用することができます。

Class<? extends Storage> clazz = map.get(storageType); 
if (clazz == null) { 
    throw new UnsupportedStorageTypeException(); 
} 
Storage storage = clazz.newInstance(); 
+0

Java 8を使用している場合は、コンストラクタをマップに格納し、リフレクションをスキップするだけです。この[回答](https://stackoverflow.com/a/29220300/6893866)を参照してください。 – Tezra

2

Factory Patternはあなたに見えるべきものです。それはまさにあなたが望むものです。

+0

ありがとう!私はチュートリアルを見ています。私は正しい答えとしてマークしていますDherikの方が速いのですが、あなたも同じように便利です – Arcones

関連する問題