Как подписаться на свойство в созданном объекте в Java - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть класс, который реализует интерфейс из библиотеки третьей части, и один из методов передает объект класса с именем 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 истинным или ложным, но не для изменения.

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

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Вы можете написать свой собственный класс слушателя с помощью некоторого метода в этом классе.Вызвать этот метод класса слушателя внутри метода 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....");
        }
    }
}}
0 голосов
/ 28 ноября 2018

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

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

0 голосов
/ 28 ноября 2018

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

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 ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...