如何建模扩展Observable以访问状态信息的类:在显式调用构造函数时不能引用实例字段

时间:2015-12-30 16:33:59

标签: reactive-programming rx-java

我想建立一个工业系统的模型,该系统由一个传送带组成,传送带上有一个传感器,用于检测物体何时使用RxJava到达某个位置。

为了模拟传感器,我有一个假类,它应该接收和对象位置,并随着时间增加它,直到它达到假定的传感器位置。然后它会通知它的观察者(传送带):

public class FakeBeltPositionSensor extends Observable<Signal>{

    private double objectPosition;
    protected Double sensorPosition;

    public FakeBeltPositionSensor(Double sensorPosition) {
        super( (s) -> {
            Thread.sleep(500);
            objectPosition += 1;
            if(objectPosition == sensorPosition){
                s.onNext(new Signal(Signal.Type.SENSOR_REACHED));
                s.onCompleted();
            }
        });
    }

    public Double getSensorPosition() {
        return sensorPosition;
    }

    public void setObjectPosition(double objectPosition){
        this.objectPosition = objectPosition;
    }
}

我面临的问题是,显然我无法在类构造函数中访问double objectPositionCannot refer to an instance field objectPosition while explicitly invoking a constructor

由于扩展Observable会强制您在构造函数中实现Observable-&gt;订阅者登录,您将如何为此场景建模?

我们的想法是FakeBeltPositionSensor可以连续运行并且能够使用setObjectPosition更新对象位置。

1 个答案:

答案 0 :(得分:1)

我不认为直接扩展Observable是个好主意,除非你真的知道你在做什么。以下是其他一些需要考虑的实现(使用Subject s):

public class FakeBeltPositionSensor {

    private double objectPosition;
    protected Double sensorPosition;

    // or your Signal type instead of Void
    private Subject<Void, Void> positionSubject = PublishSubject.<Void> create().toSerialized();

    public FakeBeltPositionSensor(Double sensorPosition) {
        this.sensorPosition = sensorPosition;
        initPositionShift();
    }

    private void initPositionShift() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        objectPosition++;
        if (objectPosition == sensorPosition) {
            positionSubject.onNext(null);
            positionSubject.onCompleted();
        }
    }

    public Observable<Void> positionReached() {
        return positionSubject;
    }

    public Double getSensorPosition() {
        return sensorPosition;
    }

    public void setObjectPosition(double objectPosition) {
        this.objectPosition = objectPosition;
    }
}

您必须针对您的情况进行调整:制作某些有意义类型的Subject中继项(而不是Void),可选择在setObjectPosition()中添加对目标位置的检查(但请确保您没有尝试在onNext()之后调用onCompleted())等。

subscribe更改,请使用positionReached()