相互访问两个对象的方法



嗨,我正在用 Java 做应用程序来控制一些带有 RS232 端口的机械设备。

代码正在工作;)但它非常大和混乱,所以我试图让它更接近设计父亲,更容易实现新事物,所以我开始使用 来自Apache Fundation的"commons SCXML"状态机器代码,用于控制应用程序行为,因为可能会发生很多状态,例如传输失败等。

有 3 种状态:空闲、connection_attempt和已连接。

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

有一个带有 main 方法的 Knapx 类,它创建两个对象: "KnapxInterface"对象 - 包含 gui 内容,例如具有 RS232 波特率和组合名称的组合框和"StateMachine"对象 - 其中包含"fireEvent"方法和特定状态执行代码。

纳普克斯类:

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"类的"状态机"对象中时,我无法从基于"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);
});
}   
}

但是当我创建状态机器对象时,还没有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);
}

最新更新