gpt4 book ai didi

java - 我可以泛化以下代码吗?

转载 作者:行者123 更新时间:2023-12-01 11:53:46 26 4
gpt4 key购买 nike

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

@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()行之后代码周围的重复项?

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

目前,我知道本类(class)需要七种不同的方法,甚至可能更多。

最佳答案

不幸的是,在 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 个新类来增加复杂性。这是否值得取决于您的代码所处的上下文,并且是您的决定。

关于java - 我可以泛化以下代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28590995/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com