美好的一天。
我有一门课,我将用它来为训练目的生成数学练习。该课程由一系列方法组成,每一种方法都会产生一种类型的练习。
然后我想制作一个生成随机类型的随机练习的方法。为此,我想将方法名称存储在一个数组中,并调用一个随机条目。
到目前为止一切顺利。
因为将来我会添加生成新练习类型的方法,我想知道是否有一种方法可以动态生成方法数组:一旦加载了类,构造函数就会检查可用的方法并将它们的名称存储在数组中。
这可能吗?如果是这样,怎么样?
答案 0 :(得分:6)
您可以使用反射来发现类的方法。
但是在我看来,这是一个糟糕的架构。处理不同练习的更好方法是创建一个由IExercise
类实现的接口*Exercise
。然后创建这些对象,将它们放入一个数组中并选择一个randomely。然后从接口或其他东西调用指定的方法......
答案 1 :(得分:3)
您可以存储方法代理
,而不是存储名称Method[] methods = getClass().getDeclaredMethods();
你需要通过这些忽略你添加的任何不是测试的方法。
答案 2 :(得分:3)
我高兴地建议查找策略模式:
http://en.wikipedia.org/wiki/Strategy_pattern
您如何将其应用于您的问题?只需创建具有多种常用接口的对象(一种为您提供创建练习的方法),并使用此对象的列表。
您还将练习一种非常有用的模式!
答案 3 :(得分:2)
您可以使用Reflection API
使用
Method[] methods= Class.forName("ClassTo test").getDeclaredMethods();
说过调用方法时有很多事情可能会出错。
你可以通过
来避免它interface IExercise
{
void createExercise();
}
class Exercise1 implements IExercise
{
@Override
public void createExercise()
{
}
}
然后您可以使用IExercise[]
随机生成Exercise
。
答案 4 :(得分:1)
我认为通过使用Command模式并将每个练习存储为实现标记接口(ICommand)的命令类,您会更安全。之后,您可以使用反射在运行时检测在类路径上实现ICommand的所有类,以获得可以运行的练习列表。这也可以使您不必在随机选择代码中添加您在集合中设计的每种新类型的练习。
http://en.wikipedia.org/wiki/Command_pattern
这有点类似于下面建议的策略模式。
答案 5 :(得分:0)
创建像:
这样的对象MathExample math = new MathExample();
并将其添加到ArrayList<Objects>
答案 6 :(得分:0)
我认为,最好在数组中创建chain of responsibility和stroe命令。随机选择命令并放入链中。