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




на самом деле наоборот, автомобилю нужен интерфейс, но не нужно его реализовывать
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 ...
}
Вы можете написать свой собственный класс слушателя с помощью какого-либо метода в этом классе. Вызовите этот метод класса слушателя внутри метода 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 минут это изменилось, как я отнесусь к этому изменению?
запускается ли метод onObjectMoved () при изменении скорости? Если да, вам не нужно ничего делать, и doSomething будет вызван автоматически.
да, это тот случай, когда onObjectMoved () не запускается при изменении скорости, что мне нужно, чтобы иметь слушателя для объекта, который передается с первого места
Это не должно быть случаем, когда скорость изменяется и onObjectMoved () не вызывается. Кстати, я обновил фрагмент кода для вашего случая. Пожалуйста, посмотрите.
Судя по всему, MotionListener является слушатель. Вам нужно это реализовать. Каждый раз, когда MyCar перемещается, вызываются методы OnObjectMoved () и OnObjectStopped (). В этих методах делайте все, что должно происходить, когда машина движется или останавливается, например, пересчитывайте положение.
Что касается слушателей, слушатель будет вызываться внешним объектом каждый раз при изменении скорости. Итак, вашему методу просто нужно посмотреть на значение и что-то с ним сделать. Я предполагаю, что у Velocity есть геттеры для скорости и направления.
Я обновил имя логического значения относительно бизнеса: как можно прослушивать переменную, которая находится в этом объекте
не могли бы вы объяснить, как я буду использовать объект myCar в классе MyPolice, который вы создали?