Взаимный доступ к методам двух объектов

Привет Я использую приложение в Java для управления некоторым механическим устройством с портом RS232.

Код работает;) но он очень большой и беспорядочный, поэтому я стараюсь сделать его ближе к дизайну paterns и проще реализовать новые вещи, поэтому я начал использовать код конечного автомата «commons SCXML» из Apache Fundation для управления поведением приложений, поскольку там так много состояний, которые могут возникать как ошибки передачи и другие.

Существует 3 состояния: idle, connection_attempt и связанные.

Существует 4 события: try_to_connect, connection_attempt_success, connection_attempt_failed, try_to_disconnect

Существует класс Knapx с основным методом, который создает два объекта: объект «KnapxInterface», который содержит элементы gui, такие как комбинированные поля с синтаксическими расширениями RS232 и имя comport, и объект 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, и я хочу заставить его вызвать метод getRs232Setting из класса «Gui»:

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

Но как?! Я не могу использовать метод огня из объекта «KnapxInterface» на основе класса «Gui», в то время как я нахожусь в объекте «StateMachine» на основе класса «StatusFSM», не создавая некоторую «ссылку» - я начинаю на 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, поэтому он не является правильным.

Пожалуйста, дайте мне знать, как справиться с такой проблемой. Я знаю, что это простой, но мощный Soluton, но я не знаю, как назвать свою проблему, чтобы найти ее в таких книгах, как Cay Horstmann - Java, которая лежит на моем столе.

благодаря

java,scxml,

0

Ответов: 1


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);
}
Java, SCXML,
Похожие вопросы