我可以生成以下代码吗?
Can I generify the following code?
我在 class 中有一些方法是这样的:
@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 中我需要七种不同的方法,可能还有更多。
引入一个不执行任何操作的虚拟回调,然后执行 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());
这个有用吗?
不幸的是,在 Java 1.7 中没有办法在不增加代码量的情况下解决这个问题。您 可以 通过引入一些助手 classes 来减少本地所需的代码量。
一个解决方案是将您的匿名内部 classes 移动到顶级 classes。从那里你可以引入一个虚拟回调和一些空检查工作一个抽象 class.
它最终可能看起来像这样(水平规则用于突出显示这些 class 位于不同的文件中)。
这是一个虚拟回调 class,它什么都不做,但可以安全调用。这将替换 null
值。
public class NullServiceCallBack<T> implements ServiceCallBack<T> {
@Override
public void onSuccess(T target) {}
@Override
public void onError() {}
}
这是一个处理验证的抽象 class,将 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;
}
}
这是具体的 class 您将用于成功。
public class SuccessCallbackAction<T> extends CallBackAction<T> {
public SuccessCallbackAction(ServiceCallBack<T> callback) {
super(callback);
}
@Override
public void call(T target) {
getCallback().onSuccess(target);
}
}
这是错误的具体 class。这不会对要调用的参数做任何事情,所以我们可以为 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 个新的 classes 增加了复杂性。这是否值得取决于您的代码所处的环境,以及您的决定。
我在 class 中有一些方法是这样的:
@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 中我需要七种不同的方法,可能还有更多。
引入一个不执行任何操作的虚拟回调,然后执行 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());
这个有用吗?
不幸的是,在 Java 1.7 中没有办法在不增加代码量的情况下解决这个问题。您 可以 通过引入一些助手 classes 来减少本地所需的代码量。
一个解决方案是将您的匿名内部 classes 移动到顶级 classes。从那里你可以引入一个虚拟回调和一些空检查工作一个抽象 class.
它最终可能看起来像这样(水平规则用于突出显示这些 class 位于不同的文件中)。
这是一个虚拟回调 class,它什么都不做,但可以安全调用。这将替换 null
值。
public class NullServiceCallBack<T> implements ServiceCallBack<T> {
@Override
public void onSuccess(T target) {}
@Override
public void onError() {}
}
这是一个处理验证的抽象 class,将 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;
}
}
这是具体的 class 您将用于成功。
public class SuccessCallbackAction<T> extends CallBackAction<T> {
public SuccessCallbackAction(ServiceCallBack<T> callback) {
super(callback);
}
@Override
public void call(T target) {
getCallback().onSuccess(target);
}
}
这是错误的具体 class。这不会对要调用的参数做任何事情,所以我们可以为 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 个新的 classes 增加了复杂性。这是否值得取决于您的代码所处的环境,以及您的决定。