2016-02-25 135 views
0

我目前是兩個類。響應一個簡單的屬性「responseCode」。響應有一個靜態實例(當它是KO時,它是一個簡單的響應)。如何返回子類中的靜態實例類型

我也有一個類DetailResponse這是我的類響應的子類。

我會做的是能夠使用靜態變量KO_RESPONSE在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; 
    } 
} 

我的子類DetailResponse延伸響應:

public class DetailResponse extends Response { 
    public String otherField; 
} 

BuisinessService類:

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; 
     } 
    } 
} 
+2

爲什麼不使用你是否僅僅用適當的返回碼返回了一個'DetailResponse'的新實例,而沒有額外的數據呢?如果要使用靜態字段(或靜態工廠方法),則必須爲每種類型提供一個靜態字段並相應地進行選擇,您無法在運行時使用靜態字段並更改其類型。 – Thomas

+0

您是否需要將'Response.KO_RESPONSE'永遠作爲(非詳細)'Response'?或者它總是屬於'DetailResponse'類型? – bradimus

+0

@Thomas我想你是對的。我期待着做一些容易閱讀的東西。我認爲有可能用泛型類型和靜態工廠做一些事情,但它仍然比簡單的構造函數更復雜。 –

回答

-1

靜態變量和方法不能被繼承,但是你可以使用靜態塊初始化器

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; 
    } 
+3

這似乎是一個糟糕的主意。如果在加載「DetailResponse」類之前訪問'KO_RESPONSE',則它將僅爲空。另外,請注意'KO_RESPONSE'只存在一次,所以當其他子類做相似的處理時,它基本上是非確定性的。 – Hoopje

+0

此外,該字段現在是「公開」,但不是「最終」。任何班級都可以重新分配。 – bradimus

+0

我正在回答他問的問題。你提到的那些問題是給定代碼的設計缺陷,這不是我的錯 – Nadir

0

您正在嘗試覆蓋static變量,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>); 
    } 
    } 

最後商務艙可以如下實施:

public BuisinessService { 
    public DetailResponse sendRequest() { 
     String status = sendRequest() // Do something 
     if(status.equals("KO")) { 
      return DetailResponse.getInstance(); // 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; 
     } 
    } 
} 

希望這有助於!

+0

如果每次'getInstance()'返回一個新實例,那麼你沒有單例。 – bradimus

+0

是的,我們不會稱它爲單身人士。儘管這符合托馬斯的要求。謝謝,我會編輯我的答案。 –

-1

爲什麼你在這裏使用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; 
    } 
} 

你也必須申報爲您詳細的答覆類參數的構造函數,可以用來定義

+0

這沒有解決問題。 – bradimus

+0

@bradimus - 是的,現在我明白托馬斯貝多斯提出的觀點謝謝! – PyThon