我不知道如何很好地称呼它...我希望灵感会在以后出现,我可以对其进行更新,但是...
让我用一些(伪)代码描述一下:
我试图以一种整洁的方式处理服务器上的AJAX请求,这就是我想出的。
基本要求:
public abstract class BaseRequest<T> {
private final T details;
public BaseRequest(T details) {
this.details = details;
}
public abstract void process();
}
然后,我有一个处理一些传入数据的请求,可以说它是用于登录请求的,其中LoginDetails
是一个bean:
public class LoginRequest extends BaseRequest<LoginDetails> {
public LoginRequest(T details) {
super(details);
}
/**
* @Override
*/
public void process() {
Toolbox.login(this.details);
}
}
直到现在为止,这种方法都运行良好...我有各种请求,在这些请求中,我将表单数据绑定到bean,并使用Future将它们传递给这些请求。一切都很好...直到...
我决定提出注销请求。该请求不需要将数据绑定到Bean,因此我不希望定义类型参数(很可能会中断)。我想要做的是这样的:
public class LogoutRequest extends BaseRequest {
public LogoutRequest() {
super(null);
}
/**
* @Override
*/
public void process() {
Toolbox.logout();
}
}
尽管它确实可以编译和工作,但由于类型安全性,它使我的皮肤爬行。
现在...我知道如何解决这个问题,但我想知道是否有更好的方法。
我的解决方案
将具有一个无类型的基本请求和一个此类型的子类,数据请求子类和注销请求将仅对该无类型的基本请求进行子类化。
未输入的基本要求:
public abstract class BaseRequest {
public abstract void process();
}
输入的基本数据请求:
public abstract class BaseDataRequest<T> extends BaseRequest {
private final T details;
public BaseDataRequest(T details) {
this.details = details;
}
}
然后登录:
public class LoginRequest extends BaseDataRequest<LoginDetails> {
public LoginRequest(T details) {
super(details);
}
/**
* @Override
*/
public void process() {
Toolbox.login(this.details);
}
}
并注销:
public class LogoutRequest extends BaseRequest {
/**
* @Override
*/
public void process() {
Toolbox.logout();
}
}
我只是想确保我的解决方案是最好的选择,并且我没有错过任何指定NULL类型的方法(我知道这个概念不存在)或类似的东西。有人可以帮我确认一下。
另外,我正在提出有关该问题的更新标题的建议。
您在考虑某种null类型的方向正确。Java中不存在这样的东西,但是Java确实包含了Void
class。
Void类是一个无法实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用。
您可以设置type参数Void
,以便只能null
在调用中将其传递给超类构造函数。
public class LogoutRequest extends BaseRequest<Void> {
public LogoutRequest() {
super(null);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句