我不知道如何很好地命名这个......我希望灵感会在以后出现并且我可以更新它,但是......
让我用一些(伪)代码来描述一下:
我正在尝试以一种整洁的方式处理我的服务器上的 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);
}
}
到目前为止,这一直运行良好......我有各种请求,我将表单数据绑定(bind)到 bean 并使用 Futures 将它们传递给这些请求。一切都很好……直到……
我决定发出注销请求。此请求不需要将数据绑定(bind)到 bean,因此我不想定义类型参数(eeeek 这一切都会中断)。我希望能够做的是这样的事情:
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 确实包含 the Void
class .
The Void class is an uninstantiable placeholder class to hold a reference to the Class object representing the Java keyword void.
您可以将类型参数设置为Void
,这样在调用父类(super class)构造函数时只能传递null
。
public class LogoutRequest extends BaseRequest<Void> {
public LogoutRequest() {
super(null);
}
}
关于父类(super class)上的 Java 泛型但并非所有子类都想定义类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29111493/