2

編集:

私が求めていることが十分に明確ではないように思われますが、もっとよく説明しようとします。

というクラスがありますBoard

このクラスは、整数で埋められた 2 次元配列を持ち、配列内の各整数値はいくつかのクラスに対応します (たとえば、1 は String の短縮形である可能性があります)。

このクラスには、この 2 次元配列を取得してループし、いくつかのクラスの新しいインスタンスを作成する手段もあります。

2 次元配列と、さまざまな整数が対応するクラスをカスタマイズできるようにする必要があります。

私が欲しいものを視覚化するために小さな画像を作成しました: http://i.imgur.com/bZXrw.png

いくつかの擬似コードとともに:

class Board:
   Integer[][] some_array = {{1,2,1},{1,2,1}}
   someStructure = {1 : createThing, 2 : createSomeOtherThing};

   generateObjects():
        List[Thing] container = []
        for y in some_array:
            for x in y:
                container.add(someStructure[x]())
        return container

古い処方:

Mapオブジェクトを含むはずのクラスが呼び出されInteger[][]ました。整数配列オブジェクト内の値は、初期化する必要があるオブジェクトに対応しています。

さて、Python のような言語では、たとえば、キーとしていくつかの整数値を持つ辞書と、呼び出されたときに新しいオブジェクトを作成して返すいくつかの関数を持ち、2d-list をループして、dict によって返された関数を呼び出すことができます。Javaでこれを行うにはどうすればよいですか?

私は HashMap を持っていて、何らかのリフレクションを行うことについて考えましたが、何をすべきか本当にわかりません。

4

1 に答える 1

3

Java には関数へのクロージャーやポインターはありませんが、インターフェイスを実装する一連のクラスを持つことができ、各クラスにはメソッド (たとえば、「run」または「makeObject」と呼ばれるメソッドなど、意味のあるものは何でも) があります。あなたの文脈)。これらのメソッドは、必要なさまざまなオブジェクトを作成します。これらのクラスを辞書に保存できます。

テストされていない、簡単で汚い擬似コードを次に示します。

/**
* root for your object hierarchy
*/
public class MyObject
{
    // yadayada
}

/**
* The interface
*/
interface ObjCreator
{
    public MyObject makeObject();
}


/**
* Classes to create specific objects
*/
public class ObjMaker_1
    implements ObjCreator
{
    public MyObject makeObject()
    {
        return new Object1();
    }
}

...

public class ObjMaker_n
    implements ObjCreator
{
    public MyObject makeObject()
    {
        return new Objectn();
    }
}



/** your dictionary */
Map<Integer, ObjCreator> dict = new HashMap<Integer, ObjCreator>();

dict.add(new Integer(1), new ObjMaker_1);
dict.add(new Integer(2), new ObjMaker_2);
...
dict.add(new Integer(n), new ObjMaker_n);

オブジェクト作成関数が短く単純な場合は、完全に定義されたクラスではなく、匿名クラスをディクショナリに入力するのがおそらく最善です。

于 2012-04-19T19:51:06.353 に答える