Java 如何返回子类类型中的静态实例
我目前在两个班。具有简单属性“responseCode”的响应。响应有一个静态实例(当它是KO时是一个简单的响应) 我还有一个类DetailResponse,它是我的类Response的一个子类 我要做的是能够使用RESPONSE类中的静态变量KO_RESPONSE返回DetailResponse类型的对象。有没有简单的方法 我的超级课堂回答:Java 如何返回子类类型中的静态实例,java,inheritance,static,Java,Inheritance,Static,我目前在两个班。具有简单属性“responseCode”的响应。响应有一个静态实例(当它是KO时是一个简单的响应) 我还有一个类DetailResponse,它是我的类Response的一个子类 我要做的是能够使用RESPONSE类中的静态变量KO_RESPONSE返回DetailResponse类型的对象。有没有简单的方法 我的超级课堂回答: public class Response { public static final Response KO_RESPONSE = new A
public class Response {
public static final Response KO_RESPONSE = new A(ReturnCode.KO);
public ReturnCode responseCode;
public String comment;
public Response () {};
public Response (ReturnCode responseCode) {
this.responseCode = responseCode;
}
public static enum ReturnCode {
OK,
KO;
}
}
public class DetailResponse extends Response {
public String otherField;
}
我的子类DetailResponse扩展了响应:
public class Response {
public static final Response KO_RESPONSE = new A(ReturnCode.KO);
public ReturnCode responseCode;
public String comment;
public Response () {};
public Response (ReturnCode responseCode) {
this.responseCode = responseCode;
}
public static enum ReturnCode {
OK,
KO;
}
}
public class DetailResponse extends Response {
public String otherField;
}
业务服务类别:
public BuisinessService {
public DetailResponse sendRequest() {
String status = sendRequest() // Do something
if(status.equals("KO")) {
return Response.KO_RESPONSE; // What I would do but doesn't work because Response is the super class of DetailResponse
} else {
DetailResponse detail = new DetailResponse(ReturnCode.OK);
detail.comment = "comment";
detail.otherField = "somethingCool";
return detail;
}
}
}
静态变量和方法不会被继承,但可以使用静态块初始值设定项
public class Response {
public static Response KO_RESPONSE;
public ReturnCode responseCode;
public String comment;
public Response () {};
public Response (ReturnCode responseCode) {
this.responseCode = responseCode;
}
public static enum ReturnCode {
OK,
KO;
}
}
public class DetailResponse extends Response {
static {
Response.KO_RESPONSE = new DetailResponse(/* .. */);
}
public String otherField;
}
您试图覆盖
静态变量,Java不允许这样做。相反,您可以实现下面的模式来获取基类和子类的实例。以下是一个例子:
public class Response {
public static Response getInstance(){
return new Response(<args>);
}
}
public class DetailedResponse extends Response {
public static DetailedResponse getInstance(){
return new DetailedResponse(<args>);
}
}
希望这有帮助 为什么在这里使用A(),A没有定义
public static final Response KO_RESPONSE = new A(ReturnCode.KO);
这里可以使用详细的响应或其他类型的响应
class DetailResponse extends Response {
public DetailResponse(ReturnCode ko) {
super(ko);
}
public String otherField;
}
class Response {
public static final Response KO_RESPONSE = new Response(ReturnCode.KO);
public ReturnCode responseCode;
public String comment;
public Response () {};
public Response (ReturnCode responseCode) {
this.responseCode = responseCode;
}
public static enum ReturnCode {
OK,
KO;
}
}
此外,您必须为详细响应类声明一个参数化构造函数,该构造函数可用于定义为什么不返回一个新的DetailResponse
实例,其中包含相应的返回代码,而不包含其他数据?不能在运行时使用静态字段并更改其类型,如果要使用静态字段(或静态工厂方法),则必须为每种类型提供一个字段并进行相应选择。是否需要响应。KO_响应
是否曾经是(非详细)响应
?还是永远都是DetailResponse
?@Thomas我想你是对的。我想做一些易读的东西。我认为可以使用泛型类型和静态工厂做一些事情,但它仍然比简单的构造函数更复杂。@bradimus是的,这将是一个详细的响应。然后按照@Thomas的建议进行操作,或者将静态实例移动到子类。如果每次getInstance()
,都返回一个新实例,你没有单身。是的,我们不会叫它单身。尽管这满足了托马斯的要求。谢谢,我将编辑我的答案。这似乎是个坏主意。如果在加载类DetailResponse
之前访问kou RESPONSE
,则该类将为空。另外,请注意,KO_RESPONSE
只存在一次,因此当其他子类执行类似操作时,它所包含的内容基本上是不确定的。此外,该字段现在是public
,而不是final
。任何班级都可以重新分配。我正在回答他提出的问题。你提到的那些问题是给定代码的设计缺陷,不是我的错。这并没有解决问题。@bradimus-是的,现在我明白Thomas Betous的观点了,谢谢!