1

Obj1、Obj2.... ObjX という名前のオブジェクトをたくさん作成しています。

Object Obj1 = new Object();
Object Obj2 = new Object();
Object ObjX = new Object();

今、私はこのオブジェクトの 1 つにアクセスしたい関数を持っています。

public void useObject(int objectNumber) {
     String objectName = "Obj" + objectNumber;
     objectName.doAnythingWithThisObject();
     }

C#またはJavaでそのようなことは可能ですか? 次のようなものは使いたくない:

switch(objectNumber) {
      case 1: 
        Obj1.doThis();
       break;
      case 2: 
        Obj2.doThis();
       break;

switch/if-else を使用すると、同じ関数を異なるオブジェクトで呼び出さなければならないため、多くのコードを繰り返さなければならず、読みにくくなります。

4

4 に答える 4

1

答えは... しないでください。代わりに配列を使用してください。これがまさに彼らの目的です。

ObjectType[] objectArray = new ObjectType[10]; // Or as many as required.
for (int i = 0; i < objectArray.length; i++) {
    objectArray[i] = new ObjectType(); // Or whatever constructor you need.
}

// Then access an individual object like this...
ObjectType obj = objectArray[4];

// Or...
objectArray[5].someMethod();
于 2016-03-28T17:03:36.663 に答える
1

これは古典的な戦略パターンの問題のように聞こえます戦略デザインパターン

于 2016-03-28T16:00:44.230 に答える
1

実際の答えは次のとおりです。一般的に言えば、実行時に文字列を使用して変数にアクセスするべきではありません。これが実際に適切なケースはほとんどなく、説明のために簡略化された例は、それに適していません

代わりに、単にコレクションまたは配列を使用してオブジェクトを格納してみませんか? @TRRohith は回答で例を挙げています。

それでも、 Java に適用される質問に対する直接的な回答を以下に示します。コードは C# では異なりますが、この目的で使用できる言語機能、つまりリフレクションは C# でも使用できます。


などがクラス内の静的フィールドまたはインスタンス フィールドとして宣言されている場合Obj1Obj2リフレクションを使用して名前で値を取得できます ( Java の関連ドキュメントを参照)。それらがメソッドに対してローカルである場合、そうする簡単な方法はありません (これらの質問を参照してください: for Javafor C# )。

静的フィールド

class Something {
    static Object obj1 = new Object();
    static Object obj2 = new Object();
    // etc.
}

(私は、フィールド名を小文字で開始する自由を取りました。これは、Java で受け入れられている慣行です。)

この場合、次のコードを使用して名前で変数の値を取得できます (インポートする必要がありますjava.lang.reflect.Field)。

// Get field, named obj1, from class Something.
Field f = Something.class.getDeclaredField("obj1");
// This line allows you access the value of an inaccessible (non-public) field.
f.setAccessible(true);
// Assigning the value of the field, named obj1, to obj.
// You may want to cast to a more concrete type, if you know exactly what is stored in obj1.
// The parameter for get() is ignored for static fields, so simply pass null.
Object obj = f.get(null);

// Now you can do whatever you want with obj, 
// which refers to the same object as static field obj1 of Something.
System.out.println(obj);

インスタンス フィールド

class Something {
    Object obj1 = new Object();
    Object obj2 = new Object();
    // etc.
}

インスタンス フィールドの場合とほぼ同じ方法で行うことができます。渡すクラスのインスタンスが必要なだけですf.get()Something例として、というクラスのインスタンスがあると仮定しましょうsth

// Let's say this is an instance of our class
Something sth = new Something();
// ...

// Get field, named obj1, from class Something.
Field f = Something.class.getDeclaredField("obj1");
// This line allows you access the value of an inaccessible (non-public) field.
f.setAccessible(true);
// Assigning the value of the field, named obj1, to obj.
// You may want to cast to a more concrete type, if you know exactly what is stored in obj1.
// The parameter for get() is the instance of Something, 
// for which you want to retrieve the value of an instance field, named obj1.
Object obj = f.get(sth);

// Now you can do whatever you want with obj,
// which refers to the same object as instance field obj1 of sth.
System.out.println(obj);

ローカル変数

この場合、あなたはおそらく運が悪いでしょう。繰り返しますが、次のリンクを参照してください: JavaC#

于 2016-03-28T16:56:20.813 に答える
1

コードは次のとおりです。

    //Declare this in the class so that it can be called by any method
static Object[] array = new Object[4];
public static void main()
{
    //Use this to initialize it
    Object[] array = new Object[4];
    for(int i=0;i<4;i++)
    {
        array[i] = new Object();
    }
    //You can now easily call it
    useObject(0);
    useObject(1);
    useObject(2);
    useObject(3);
}

//Your numbers may be off by 1 because we are using an array but that is easily adjusted
public static void useObject(int objectNumber)
{
    array[objectNumber].doAnythingWithThisObject();
}
于 2016-03-28T16:18:36.843 に答える