Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用安全类型将数据从一个模块发送到另一个模块_Java_Oop_Module_Data Exchange - Fatal编程技术网

Java 使用安全类型将数据从一个模块发送到另一个模块

Java 使用安全类型将数据从一个模块发送到另一个模块,java,oop,module,data-exchange,Java,Oop,Module,Data Exchange,我的问题 什么样的设计允许我在没有类型安全性的情况下在两个模块之间选择性地传递数据?这可能吗 解释 我有两个从类派生的模块 abstract class Module { public abstract void init(App app); public abstract void exit(App app); public abstract void process(App app); public abstract void paint(Graphics g

我的问题

什么样的设计允许我在没有类型安全性的情况下在两个模块之间选择性地传递数据?这可能吗

解释

我有两个从类派生的模块

abstract class Module {
    public abstract void init(App app);
    public abstract void exit(App app);
    public abstract void process(App app);
    public abstract void paint(Graphics g);
}
App类跟踪哪个模块是当前模块,并允许该模块处理执行:

class App {
    private Map<Class<? extends Module>, Module> allModules = ...;
    private Module currentModule;

    //things to be used in modules
    private Canvas canvas;

    protected void start() {
        allModules.put(FirstModule.class, new FirstModule());
        //...

        currentModule = ...;
        currentModule.init(this);
    }

    protected void process() {
        currentModule.process(this);
    }

    protected void paint(Graphics g) {
        currentModule.paint(g);
    }

    public void switchModule(Class<? extends Module> module) {
        //perform validation
        Module next = allModules.get(module);

        currentModule.exit(this);
        currentModule = next;
        next.init(this);
    }

    //expose items that modules will use
    public Canvas getCanvas() {
        return canvas;
    }
}
因此,在模块执行过程中的某个时刻,它将切换当前模块。有时我希望在当前模块和切换到的模块之间传递数据(从第一个模块到第二个模块)

我的尝试

我能想到的唯一“有效”方法是复制Android的切换活动设计(使用类似意图的对象):


另一个类中的人需要知道确切的键名,如果他们搞错了什么,在编译时没有任何警告。有更安全的方法吗?

我认为您需要的是“责任链”设计模式。
选中此处-

看起来您希望从超级类型接口访问子类型实现差异。我不确定你是否能像你那样不用地图就能做到这一点。但是,您可以使用枚举类型实现映射的键,至少提供一些编译时类型安全性。
class First extends Module {
    private boolean firstBoxChecked, secondBoxChecked, thirdBoxChecked;

    public void init(App app) {
        canvas.addMouseListener(...);
    }

    public void process(App app) {
        if(buttonClicked) {
            app.switchModule(Second.class);
            //pass data to next module
        }
    }
}
ModuleSwitchAction action = new ModuleSwitchAction(Second.class);
action.put("firstBoxChecked", "true");
//...
app.switchModule(action);