相互访问两个对象的方法

时间:2018-07-08 10:31:54

标签: java scxml

嗨,我正在用Java开发应用程序,以通过RS232端口控制某些机械设备。

代码正在运行;),但是它又大又混乱,所以我试图使其更接近设计模式并更易于实现新事物,因此我开始使用 来自Apache Fundation的“公共SCXML”状态机代码可控制应用程序的行为,因为可能会发生许多状态,例如传输失败或其他情况。

共有3种状态:空闲,连接尝试和连接。

有4个事件:try_to_connect,connection_attempt_success,connection_attempt_failed,try_to_disconnect

有一个带有main方法的Knapx类,它创建两个对象: “ KnapxInterface”对象-包含gui之类的东西,例如带有RS232波特率渗出物和命令名称的组合框,以及“ StateMachine”对象-包含“ fireEvent”方法和特定状态执行代码。

Knapx类别:

public class Knapx 
{
    public static void main(String[] args) {

        StatusFSM StateMachine= new StatusFSM();

        EventQueue.invokeLater(() -> 
        {
            Gui KnapxInterface = new Gui(StateMachine);
            KnapxInterface.setVisible(true);
        });
    }   
}

在“ Gui”类中,有一个带有一个参数的类构造函数:“链接”到触发状态机事件所需的状态机对象

public class Gui extends JFrame 
{
    public Gui(StatusFSM machine) 
    {

        //(...) some things unrelated to the question

        State_machine_engine = machine;
    }

    ButtonConnect.addActionListener(event -> ConnectComPort());

    // (...)

    private void ConnectComPort()
    {
         State_machine_engine.fireEvent("try_to_connect");
    }

}

工作原理:单击“连接”按钮会触发“ try_to_connect”事件,该事件会将状态机的状态更改为“ connection_attempt”,但是现在出现了我的问题:在StatusFSM类中有方法:

public void connection_attempt()
{
    System.out.println("STATE: connection_attempt");
}

当状态机进入connection_attempt状态时执行,我想让它从“ Gui”类中调用“ getRs232Setting”方法:

public SerialSettings getRs232Settings()
{
    Rs232Settings.PortName = (String)ComPortListJComboBox.getSelectedItem();
    Rs232Settings.BaudRate = Integer.parseInt((String)BaudRateJComboBox.getSelectedItem());
    return Rs232Settings;
}

但是如何?!我在基于“ StatusFSM”类的“ StateMachine”对象中却无法创建“ link”时无法从基于“ Gui”类的“ KnapxInterface”对象中触发方法-我是Java的初学者,因此我将尝试发送“ link” StatusFSM类构造函数的方式如下:

public class Knapx 
{
    public static void main(String[] args) {

        StatusFSM StateMachine= new StatusFSM(KnapxInterface);

        EventQueue.invokeLater(() -> 
        {
            Gui KnapxInterface = new Gui(StateMachine);
            KnapxInterface.setVisible(true);
        });
    }   
}

但是当我创建StateMachine对象时,还没有KnapxInterface对象存在,因此它不是正确的方法。

请让我知道如何处理这样的问题-我知道它必须是一个简单但功能强大的解决方案,但我不知道如何命名我的问题,因此可以在像Cay Horstmann这样的书中找到它-Java我的桌子。

谢谢

1 个答案:

答案 0 :(得分:0)

答案很简单,但如果涉及良好实践,则可能不是最佳答案。我做了其他方法

public class Alpha ()
{
Beta BetaLink;    
public void GetLink(Beta link)
{
BetaLink = link;
}
}

public class Beta()
{
Alpha AlphaLink;    
public void GetLink(Alpha link)
{
AlphaLink = link;
}
}

//last class - which puts together everything
public class Charlie()
{
Alpha AlphaObject = new Alpha();
Beta BetaObject = new Beta();
Alpha.GetLink(Beta);
Beta.GetLink(Alpha);
}