Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何返回子类类型中的静态实例_Java_Inheritance_Static - Fatal编程技术网

Java 如何返回子类类型中的静态实例

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

我目前在两个班。具有简单属性“responseCode”的响应。响应有一个静态实例(当它是KO时是一个简单的响应)

我还有一个类DetailResponse,它是我的类Response的一个子类

我要做的是能够使用RESPONSE类中的静态变量KO_RESPONSE返回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;
}
我的子类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的观点了,谢谢!