Java 相互访问两个对象的方法

Java 相互访问两个对象的方法,java,scxml,Java,Scxml,嗨,我在用Java做应用程序,用RS232端口控制一些机械设备 代码正在运行;)但是它非常大而且凌乱,所以我试图让它更接近设计模式,更容易实现新事物,所以我开始使用它 Apache基金会的“commons SCXML”状态机代码,用于控制应用程序的行为,因为有太多可能出现的状态,如传输失败等 有三种状态:空闲、连接尝试和已连接 共有4个事件:尝试连接、连接尝试成功、连接尝试失败、尝试断开连接 有一个Knapx类,其main方法创建两个对象: “KnapxInterface”对象-包含gui内容,

嗨,我在用Java做应用程序,用RS232端口控制一些机械设备

代码正在运行;)但是它非常大而且凌乱,所以我试图让它更接近设计模式,更容易实现新事物,所以我开始使用它 Apache基金会的“commons SCXML”状态机代码,用于控制应用程序的行为,因为有太多可能出现的状态,如传输失败等

有三种状态:空闲、连接尝试和已连接

共有4个事件:尝试连接、连接尝试成功、连接尝试失败、尝试断开连接

有一个Knapx类,其main方法创建两个对象: “KnapxInterface”对象-包含gui内容,如带有RS232波特率seetings和comport name的组合框,以及包含“fireEvent”方法和特定状态执行代码的“StateMachine”对象

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”类中,有一个类构造函数,它接受一个参数:“link”到触发状态机事件所需的状态机对象

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");
    }

}
它可以工作:单击Connect按钮触发“try\u to\u Connect”事件,该事件将状态机的状态更改为“connection\u trunt”,但现在出现了我的问题:在StatusFSM类中有一个方法:

public void connection_attempt()
{
    System.out.println("STATE: connection_attempt");
}
当状态机进入连接尝试状态,并且我想让它从“Gui”类调用“getRs232Setting”方法时执行:

但是怎么做?!当我在基于“StatusFSM”类的“StateMachine”对象中时,我不能从基于“Gui”类的“KnapxInterface”对象启动方法,而不进行一些“链接”-我是Java初学者,因此我会尝试通过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之类的书中找到它


谢谢

答案很简单,但如果涉及到良好实践,可能不是最好的。我提出了其他方法

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);
}
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);
}