我有一个实现第三方库接口的类,方法之一是传递名为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
是对还是错,但不能更改。
有帮助吗?
答案 0 :(得分:1)
您可以使用该类中的某些方法编写自定义侦听器类。根据布尔值在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....");});
}
}
Listener及其实现
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....");
}
}
}}
答案 1 :(得分:0)
实际上是相反的,汽车需要接口但不需要实现它
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 ...
}
答案 2 :(得分:0)
显然,MotionListener 是监听器。您需要实现它。每次MyCar移动时,都会调用OnObjectMoved()和OnObjectStopped()方法。使用这些方法,可以执行汽车行驶或停止时发生的任何事情,例如重新计算位置。
对于侦听器,每次速度变化时,外部实体都会调用该侦听器。因此,您的方法仅需要查看值并对其进行处理。我猜想Velocity具有速度和方向的吸收剂。