你好。
我有一个用于生成数学练习的类,该类由一系列方法组成,每个方法生成一种类型的练习。
我想编写一个方法,它可以生成一个随机类型的随机练习。为此,我打算将方法名存储在数组中,并调用一个随机条目。
到目前为止没问题。
由于我将来要添加生成新练习类型的方法,因此我想知道是否有一种方法可以动态生成方法的数组:一旦加载了类,构造函数就会检查可用的方法并将其名称存储在一个数组中。
这可能吗?如果是这样,怎么做?
你好。
我有一个用于生成数学练习的类,该类由一系列方法组成,每个方法生成一种类型的练习。
我想编写一个方法,它可以生成一个随机类型的随机练习。为此,我打算将方法名存储在数组中,并调用一个随机条目。
到目前为止没问题。
由于我将来要添加生成新练习类型的方法,因此我想知道是否有一种方法可以动态生成方法的数组:一旦加载了类,构造函数就会检查可用的方法并将其名称存储在一个数组中。
这可能吗?如果是这样,怎么做?
您可以使用反射来查找类的方法。
但是我认为这是一种不好的架构方式。更好的处理不同练习的方法是创建一个接口IExercise
,由*Exercise
类来实现该接口。然后创建这些对象,将它们放入数组中并随机选择一个。然后从接口中调用指定的方法或其他操作...
不要存储名称,而是存储方法代理。
Method[] methods = getClass().getDeclaredMethods();
你需要仔细阅读以下内容,并忽略任何非测试代码。
我强烈推荐查找“策略模式”:
http://en.wikipedia.org/wiki/Strategy_pattern
你如何将其应用于你的问题?只需创建实现常见接口的对象(其中一个为您提供创建练习的方法),并使用此对象的列表。
您还将练习非常有用的模式!
反射 API
来检查可用方法。 Method[] methods= Class.forName("ClassTo test").getDeclaredMethods();
话虽如此,在调用方法时很多事情可能会出错。
您可以通过只使用以下代码来避免这种情况:
interface IExercise
{
void createExercise();
}
class Exercise1 implements IExercise
{
@Override
public void createExercise()
{
}
}
然后,您可以使用IExercise[]
来随机生成Exercise
。
ClassName.class.getDeclaredMethods()
更短且更不容易出错。(免责声明:不是我说的) - Jacob Raihle我认为使用命令模式并将每个练习作为实现标记接口(ICommand)的命令类进行存储,这样更安全。然后,您可以使用反射在运行时检测实现ICommand接口的所有类,以获取可以运行的练习列表。这也可以避免您在随机选择代码中添加每种新类型的练习到集合中。
http://en.wikipedia.org/wiki/Command_pattern
这与下面建议的策略模式有些相似。
创建对象,例如:
MathExample math = new MathExample();
并将它们添加到 ArrayList<Objects>
中