首页 > 解决方案 > 使用反射来创建所有子类的对象列表是否合适?

问题描述

在我的程序中,不同的功能分为不同的模块,可能有数百个模块,每个模块都是抽象模块类的子类,看起来像这样

public abstract class Module {

    public final String name;

    public Module(String name){
        this.name = name;
    }

    public abstract void execute();
}

子类看起来像这样

public class Mod1 extends Module{
    public Mod1() {
        super("Mod1");
    }

    @Override
    public void execute() {
        //Do something
    }
}

我需要列出所有模块的实例,但是这样做有点乏味,因为我的程序可能有数百个模块并且可能很难调试(我可能会错过一些哈哈)

private static final List<Module> MODULES = new ArrayList<>();

public void init(){
    MODULES.add(new Mod1());
    MODULES.add(new Mod2());
    MODULES.add(new Mod3());
    MODULES.add(new Mod4());
    MODULES.add(new Mod5());
}

所以我认为使用反射可能是要走的路,但是在快速谷歌搜索之后,我看到很多人不喜欢生产代码中的反射,所以我来这里询问这是否是使用反射的合适案例,或者是否有任何原因或设计更改以避免在这种特殊情况下使用反射

编辑:该列表将用于在 gui 中渲染模块或从其他用户界面(如命令)调用模块的执行方法(只需找到具有匹配名称的模块并执行它)

注意:这不是我的代码实际的样子,而是一个高度简化的版本,给出了类似的想法

标签: javareflection

解决方案


也许您可以将列表传递给父类的构造函数,并在构造函数方法中将子类本身添加到列表中。像这样

public abstract class Module {

    public final String name;

    public Module(String name, List<Module> list) {
        this.name = name;
        list.add(this);
    }

    public abstract void execute();
}
private static final List<Module> MODULES = new ArrayList<>();

public void init(){
    new Mod1(MODULES);
}

推荐阅读