2

外部ソースからの文字列があります。この文字列に基づいて、オブジェクトを生成する必要があります。私が生成しなければならないすべてのオブジェクトは、同じ抽象基本クラスを拡張します。「文字列」<->「クラス」という関係のリストがあります。

私の質問は、この世代を行うための最良の方法はどこで、どのように行うのですか?

  1. if-else を使用したメソッドで別のクラスを作成できます。そして、必要な場所でそれを呼び出します。
  2. この if-else を必要な場所に直接配置できます
  3. 抽象クラスに入れることができます。
  4. 抽象クラスに追加し、Map<String,Class>リフレクションを使用してみてください(ただし、方法はわかりません)
  5. 他の何か?

abstract class Element { 
    abstract String getType();
}
class AElement extends Element{
    String getType(){return "A";}
}
class BElement extends Element{
    String getType(){return "B";}
}
class CElement extends Element{
    String getType(){return "C";}
}

class MyObject {
   Element element;
   MyObject(String text){
   //here I conscruct my object form string.
   String[] elem = text.split(";");
   this.element = someMethod(elem[3]);
}

elem[3] がテキスト「A」、「B」、および「C」になることはわかっているので、メソッド someMethod() でそれぞれの AElement、BElement、または CElement オブジェクトを作成する必要があります。

4

3 に答える 3

3

ファクトリパターンは良い解決策です。オブジェクト作成テクニックからあなたを抽象化します。

工場内では、次のようにリフレクションを介してインスタンスを作成できます。

public static YourAbstract createObject(String className) {
    try {
       Class c = Class.forName(className);
       YourAbstract newObject = (YourAbstract)c.newInstance();
       return newObject;
    } catch (Exception e) {
       // handle the way you need it ... e.g.: e.printStackTrace();
    }
}

この質問を見てください:Javaでリフレクションを使用して、参照変数タイプが新しいインスタンスクラス名に設定された新しいインスタンスを作成しますか?

または、すべてのクラスがファクトリに認識されている場合は、configまたは同様のものから何らかのマップを作成します。

public class YourAbstractFactory {

    private static Map<String, Class> classez = new HashMap<String, Class>();

    public static YourAbstract initFactory(Map<String, Class> classes) {
        // initialize your map
        classez.putAll(classes);
    }

    public static YourAbstract initFactory(Collection<String> classes) {
        // initialize your map
        for(String className : classes) {
            try {
               Class c = Class.forName(className);
               classez.put(className, c);
            } catch (Exception e) {
               // handle the way you need it ... e.g.: e.printStackTrace();
            }
        }
    }

    public static YourAbstract createObject(String className) {
        try {
           Class c = classez.get(className);
           YourAbstract newObject = (YourAbstract)c.newInstance();
           return newObject;
        } catch (Exception e) {
           // handle the way you need it ... e.g.: e.printStackTrace();
        }
    }
}    
于 2012-07-19T08:50:13.730 に答える
0

最良の方法は、Factory Patternを使用することです。

public static SomeObject createObject(String externalString){
 //construct the object(Have your If-else here)
 return someObject;
}
于 2012-07-19T08:27:45.700 に答える
0

入力に基づいて、提供されたオブジェクトを作成できるFactory パターンを使用します。

于 2012-07-19T08:28:00.090 に答える