0

これは、コードをもう少し読みやすくするための仮説的な質問です。配列を返す別の関数を使用する以外に、このようなことを行うよりエレガントな方法はありますか? JUnit テストを書いているときにこのコードに何度か出くわしましたが、目が痛いだけです。特定のタイプのランダム配列を生成する関数が 10 個ほどありますが、非常に雑然としています。

public ObjectA getA()
{
    return new ObjectA("random", "stuff", "constructor");
}

public void doStuffWithA(ObjectA objs[])
{
    // do stuff with loop / array
}

public void main()
{
    ObjectA objs[] = new ObjectA[10];

    for (int x = 0; x < objs.length; x ++)
        objs[x] = getA();

    doStuffWithA(objs);
}

おそらく次のようなよりクリーンなもの:

doStuffWithA(toArray(getA(), 10));

しかし、実際の関数呼び出しを渡すことは不可能のようです。これでも問題ありません。

ObjectA objs[] = new ObjectA[10]{getA(), 10};
4

4 に答える 4

1

これは、関数型プログラミングではよく知られていることです。バージョン 7 までの基本的な Java (命令型言語) では不可能です。ただし、それでもこれを行う方法はあります。

最も簡単な方法は、おそらくlambdajの使い方を学ぶことです。少し複雑になりますが、それを使用すると、関数に渡すことができ、必要に応じてオブジェクトを作成するジェネレーターを構築できます。

これを行うさらに可能な方法は、指定された関数を実行するジェネレーター クラスを手動で記述することです。インターフェイスは次のようになります。

public interface Generator<T> {
    T generate();
    T[] generateSeveral(int);
}

次に、次のような実装を行うことができます。

class ObjectAGenerator implements Generator<ObjectA> {
    public ObjectA generate() {
       return new ObjectA("random", "stuff", "constructor");
    }

    public ObjectA[] generateSeveral(int amount) {
        ObjectA[] result = new ObjectA[amount];
        for(int i=0; i<amount; i++) {
            result[i] = generate();
        }
    }
}

そして、次のように使用できます。

doStuffWithA(new ObjectAGenerator().generateSeveral(10));
于 2013-11-04T14:58:13.027 に答える
-1

Arrays.fillが手伝う。

あなたはこのようにすることができます

ObjectA objs[] = new ObjectA[10];       
Arrays.fill(objs, getA());

//just printing objects     
for (int x = 0; x < objs.length; x ++)
      System.out.println(objs[x]);
于 2013-11-04T14:53:45.570 に答える
-1

Arrays.fill(ArrayOfObjects, ObjectA);

于 2013-11-04T14:54:02.603 に答える
-1

Arrays.fill(Object[] a,Object val) を試してください: http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html

于 2013-11-04T14:48:40.193 に答える