如何在Java中创建的对象中订阅属性

时间:2018-11-28 16:02:03

标签: java variables listener

我有一个实现第三方库接口的类,方法之一是传递名为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 :(得分: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具有速度和方向的吸收剂。