3

良い一日。

トレーニング目的で数学の演習を生成するために使用するクラスがあります。クラスは一連のメソッドで構成されており、それぞれが 1 種類のエクササイズを生成します。

次に、ランダムなタイプのランダムな演習を 1 つ生成するメソッドを作成したいと思います。これを行うには、メソッド名を配列に格納し、ランダム エントリを呼び出すことを考えました。

ここまでは順調ですね。

将来、新しいエクササイズ タイプを生成するメソッドを追加する予定なので、メソッドの配列を動的に生成する方法があるかどうか知りたいです。クラスがロードされると、コンストラクターは利用可能なメソッドをチェックします。それらの名前を配列に保存します。

それは可能ですか?もしそうなら、どのように?

4

7 に答える 7

6

リフレクションを使用して、クラスのメソッドを発見できます。

しかし、私の意見では、それは悪いアーキテクチャです。さまざまな演習を処理するより良い方法は、クラスIExerciseによって実装されるインターフェイスを作成することです。*Exercise次に、それらのオブジェクトを作成し、それらを配列に入れて、ランダムに選択します。次に、インターフェイスなどから指定されたメソッドを呼び出します...

于 2012-08-29T11:08:57.667 に答える
3

戦略パターンを調べることを強くお勧めします。

http://en.wikipedia.org/wiki/Strategy_pattern

それをあなたの問題にどのように適用しますか?共通のインターフェイス (演習を作成する方法を提供するもの) を実装するオブジェクトを作成し、このオブジェクトの List を使用するだけです。

また、非常に便利なパターンを練習します。

于 2012-08-29T11:09:40.773 に答える
3

Instead of storing the names you can store Method proxies

Method[] methods = getClass().getDeclaredMethods();

You need to go through these are ignore any method you add which are not tests.

于 2012-08-29T11:07:23.150 に答える
2

You can use Reflection API to check Available methods using

 Method[] methods= Class.forName("ClassTo test").getDeclaredMethods();

Having said that there are so many things can go wrong while invoking a method.

You can avoid it by just having

interface  IExercise
{
    void createExercise();
}
class Exercise1 implements IExercise
{
    @Override
    public void createExercise()
    {
    }
}

And then you can use IExercise[] to generate Exercise Randomly.

于 2012-08-29T11:07:44.150 に答える
1

コマンドパターンを使用し、各演習をマーカーインターフェイス(ICommand)を実装するコマンドクラスとして保存する方が安全だと思います。その後、リフレクションを使用して、実行時にクラスパスにICommandを実装するすべてのクラスを検出し、実行できる演習のリストを作成できます。これにより、ランダムな選択コードのコレクションにデザインするすべての新しいタイプのエクササイズを追加する必要もなくなります。

http://en.wikipedia.org/wiki/Command_pattern

これは、以下に提案する戦略パターンにいくぶん似ています。

于 2012-08-29T11:10:34.533 に答える
0

私は、責任の連鎖とストローコマンドを配列で作成する方が良いと思います。ランダムにコマンドを選択し、チェーンに入れます。

于 2012-08-29T11:11:07.123 に答える
0

Create objects like:

MathExample math = new MathExample();

And add them to ArrayList<Objects>

于 2012-08-29T11:08:11.280 に答える