Как подписаться на свойство в созданном объекте в java

У меня есть класс, который реализует интерфейс из библиотеки третьей части, и один из методов передает объект класса Velocity.

Как я могу прослушивать изменения значений конкретных переменных в этом объекте?

Вот код для лучшего понимания.

Это интерфейс из библиотеки третьей части:

public interface MotionListener {
    void onObjectMoved(Velocity velocity);
    void onObjectStopped();
}

а класс Velocity упакован в библиотеку, и это очень просто. У класса 3 атрибута. Я реализовал этот интерфейс в своем классе следующим образом:

public class MyCar implements MotionListener {

    @Override
    public void onObjectMoved(Velocity velocity) {
        System.out.println("Distance" + velocity.getDistance());
        System.out.println("Speed" + velocity.getSpeed());
        System.out.println("widnowIsOpened" + velocity.widnowIsOpened());

         /* 
I need here to set up a listener for the boolean value widnowIsOpened 
because this boolean may be change later and this method will not be invoked again 
, it is just invoked once but 
value of windowIsOpened may change by the library 
*/
    }

    @Override
    public void onObjectStopped() {

    }
    // other methods ...
}

Мне нужно прислушиваться к изменениям логического значения, чтобы реагировать на изменения в моем коде. Я много искал по этой теме, но все возможные решения, которые я нашел, если у меня есть доступ к классу Velocity, поэтому я могу установить слушателя внутри класса Velocity, но в моем случае у меня есть только переданный объект. Итак, единственное, что я могу сделать, это проверить, не widnowIsOpened верен или ложен, но не для изменения.

Любая помощь?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
149
3

Ответы 3

на самом деле наоборот, автомобилю нужен интерфейс, но не нужно его реализовывать

public interface MotionListener {
    void onObjectMoved(Velocity velocity);
    void onObjectStopped();
}

public class MyCar {
    private MotionListener myMotionListener;
    private void setMotionListener(MotionListener someMotionListener){
        myMotionListener= someMotionListener;
    }

    public void doSomething(){
        if (myMotionListener != null){
            myMotionListener.onObjectMoved(myVelocity);
        }
    }   
    public void notifiyamStop(){
        if (myMotionListener != null){
            myMotionListener.onObjectStopped();
        }
    }   

// other methods ...

}

public class MyPolice implements MotionListener {

    @Override
    public void onObjectMoved(Velocity velocity) {
        System.out.println("Distance" + velocity.getDistance());
        System.out.println("Speed" + velocity.getSpeed());
        System.out.println("isMoving" + velocity.isMoving());

         // i need here to setup a listener for the boolean value isMoving 
    }

    @Override
    public void onObjectStopped() {

    }
// other methods ...
}

не могли бы вы объяснить, как я буду использовать объект myCar в классе MyPolice, который вы создали?

Somrai 28.11.2018 17:14

Вы можете написать свой собственный класс слушателя с помощью какого-либо метода в этом классе. Вызовите этот метод класса слушателя внутри метода onObjectMoved () на основе логического значения. Если вы хотите отправить обновление нескольким слушателям, напишите интерфейс для слушателя и запишите его реализации. Если хочешь, я могу поделиться с тобой фрагментом кода.

Ну вот:

public class MyCar implements MotionListener {

private VelocityListener listener;

// added constructor
public MyCar(VelocityListener listener) {
    this.listener = listener;
}

@Override
public void onObjectMoved(Velocity velocity) {
    System.out.println("Distance" + velocity.getDistance());
    System.out.println("Speed" + velocity.getSpeed());
    System.out.println("isMoving" + velocity.isMoving());
    // added handling
    listener.doSomething(velocity);

    // I need here to set up a listener for the boolean value isMoving
}

@Override
public void onObjectStopped() {

}

public static void main(String[] args) {
    MyCar car = new MyCar(new VelocityListenerImpl());
    //if you are using java 8 then you can use functional interface like below
    //MyCar otherCar = new MyCar(()->{System.out.println("velocity changed....");});
}

}

Слушатель и его реализация

public interface VelocityListener {
public void doSomething(Velocity velocity);}

public class VelocityListenerImpl implements VelocityListener {
public void doSomething(Velocity velocity) {
    while (true) {
        if (velocity.isMoving()) {
            System.out.println("velocity changed....");
        }
    }
}}

что, если значение изменилось после выполнения строки, например: if (velocity.isMoving ()) {listener.doSomething (); } теперь это = истина, но через 5 минут это изменилось, как я отнесусь к этому изменению?

Somrai 28.11.2018 17:55

запускается ли метод onObjectMoved () при изменении скорости? Если да, вам не нужно ничего делать, и doSomething будет вызван автоматически.

G.G. 28.11.2018 17:58

да, это тот случай, когда onObjectMoved () не запускается при изменении скорости, что мне нужно, чтобы иметь слушателя для объекта, который передается с первого места

Somrai 28.11.2018 19:49

Это не должно быть случаем, когда скорость изменяется и onObjectMoved () не вызывается. Кстати, я обновил фрагмент кода для вашего случая. Пожалуйста, посмотрите.

G.G. 29.11.2018 03:33

Судя по всему, MotionListener является слушатель. Вам нужно это реализовать. Каждый раз, когда MyCar перемещается, вызываются методы OnObjectMoved () и OnObjectStopped (). В этих методах делайте все, что должно происходить, когда машина движется или останавливается, например, пересчитывайте положение.

Что касается слушателей, слушатель будет вызываться внешним объектом каждый раз при изменении скорости. Итак, вашему методу просто нужно посмотреть на значение и что-то с ним сделать. Я предполагаю, что у Velocity есть геттеры для скорости и направления.

Я обновил имя логического значения относительно бизнеса: как можно прослушивать переменную, которая находится в этом объекте

Somrai 28.11.2018 17:28

Другие вопросы по теме