我可以生成以下代码吗?

时间:2015-02-18 18:20:56

标签: java generics rx-java

我在这样的类中有一些方法:

@Override
public void sendRemoteRecord(String token, int channelId, int eventId, final ServiceCallback<RemoteRecordResponse> callback) {

    epgServicesApiManager.sendRemoteRecord(token, channelId, eventId)
            .observeOn(scheduler)
            .subscribe(new Action1<RemoteRecordResponse>() {
                @Override
                public void call(RemoteRecordResponse model) {
                    if (callback != null)
                        callback.onSuccess(model);
                }
            }, new Action1<Throwable>() {
                @Override
                public void call(Throwable throwable) {
                    if (callback != null)
                        callback.onError();
                }
            });
}

@Override
public void activateRemoteRecord(String token, String cardNumber, final ServiceCallback<RemoteRecordActivateResponse> callback) {

    epgServicesApiManager.activateRemoteRecord(token, cardNumber)
            .observeOn(scheduler)
            .subscribe(new Action1<RemoteRecordActivateResponse>() {
                @Override
                public void call(RemoteRecordActivateResponse remoteRecordActivateResponse) {
                    if (callback != null)
                        callback.onSuccess(remoteRecordActivateResponse);
                }
            }, new Action1<Throwable>() {
                @Override
                public void call(Throwable throwable) {
                    if (callback != null)
                        callback.onError();
                }
            });
}

是否可以在observeOn()行之后删除代码周围的重复?

令人讨厌的部分是确保在使用它之前对回调进行空检查。

目前,我知道我需要七种不同的方法,可能更多。

2 个答案:

答案 0 :(得分:1)

不幸的是,在Java 1.7中,没有办法在不增加代码量的情况下解决这个问题。通过引入一些帮助程序类,可以减少本地所需的代码量。

一种解决方案是将您的匿名内部类移动到顶级类。从那里你可以引入一个虚拟回调和一些空值检查工作一个抽象类。

它可能最终看起来像这样(水平规则用于突出显示这些类在单独的文件中)。


这是一个虚拟回调类,它什么都不做,但可以安全地调用。这将取代null值。

public class NullServiceCallBack<T> implements ServiceCallBack<T> {
    @Override
    public void onSuccess(T target) {}

    @Override
    public void onError() {}
}

这是一个抽象类,用于处理验证,将null值转换为NullServiceCallback的实例:

public abstract class CallBackAction<T> implements Action1<T> {
    private final ServiceCallBack<T> Callback;

    public CallBackAction(ServiceCallBack<T> callback) {
        this.Callback = (null != callback) ? callback : new NullServiceCallBack<>();
    }

    protected ServiceCallBack<T> getCallback() {
        return Callback;
    }
}

这是你将用于成功的具体课程。

public class SuccessCallbackAction<T> extends CallBackAction<T> {

    public SuccessCallbackAction(ServiceCallBack<T> callback) {
        super(callback);
    }

    @Override
    public void call(T target) {
        getCallback().onSuccess(target);
    }
}

这是错误的具体类。这对调用的参数没有任何作用,因此我们可以为Object创建一次这个实现并完成它。

public class ErrorCallbackAction extends CallBackAction<Object> {
    public ErrorCallbackAction(ServiceCallBack<Object> callback) {
        super(callback);
    }

    @Override
    public void call(Throwable target) {
        getCallback().onError();
    }
}

所以最后,你上面的例子应该是这样的:

@Override
public void sendRemoteRecord(String token, int channelId, int eventId, final ServiceCallback<RemoteRecordResponse> callback) {

    epgServicesApiManager.sendRemoteRecord(token, channelId, eventId)
            .observeOn(scheduler)
            .subscribe(new SuccessCallbackAction<RemoteRecordResponse>(callback), 
                       new ErrorCallbackAction(callback));
}

@Override
public void activateRemoteRecord(String token, String cardNumber, final ServiceCallback<RemoteRecordActivateResponse> callback) {

    epgServicesApiManager.activateRemoteRecord(token, cardNumber)
            .observeOn(scheduler)
            .subscribe(new SuccessCallbackAction<RemoteRecordActivateResponse>(callback),
                       new ErrorCallbackAction(callback));
}

在本地,我们减少了代码量,并使意图更加清晰。在全球范围内,我们增加了4个新课程,增加了复杂性。这是否值得,取决于您的代码所处的环境,并且是您的电话。

答案 1 :(得分:0)

引入一个无效的虚拟回调,然后执行safeCallback().onSuccess()safeCallback().onError()

另外,你可以这样做:

class SuccessCallback<T> extends Action1<T>() {
                @Override
                public void call(T value) {
                    safeCallback().onSuccess(value);
                }
}

class ErrorCallback extends Action1<Throwable>() {
                @Override
                public void call(T value) {
                    safeCallback().onError();
                }
}

...然后

subscribe(new SuccessCallback<RemoteRecordActivateResponse>(), new ErrorCallback());

这有用吗?