2016-02-25 4 views
0

Я в настоящее время два класса. Ответ с помощью простого атрибута «responseCode». Ответ имеет статический экземпляр (простой ответ, когда он является KO).Как вернуть статический экземпляр в подкласс типа

У меня также есть класс DetailResponse, который является подклассом моего класса Response.

Что бы я хотел сделать, так это вернуть объект типа DetailResponse, используя мою статическую переменную KO_RESPONSE в классе Response. Есть ли способ сделать это просто?

Мой супер класс Ответ:

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

@ Томас, я думаю, ты прав. Я искал что-то легко читаемое. Я думаю, что возможно сделать что-то с родовым типом и статическим заводом, но он все равно будет более сложным, чем простой конструктор. –

ответ

-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

Это похоже на плохую идею. Если 'KO_RESPONSE' доступен, прежде чем будет загружен класс' DetailResponse', он будет просто пустым. Также обратите внимание, что 'KO_RESPONSE' существует только один раз, поэтому, когда другие подклассы делают что-то похожее, он по сути не детерминирован, что он содержит. – Hoopje

+0

Кроме того, поле теперь 'public ', но не' final'. Любой класс может переназначить его. – 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

Да, мы не будем называть его singleton. Хотя это удовлетворяет то, о чем спрашивает Томас. Спасибо, я отредактирую свой ответ. –

-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

Смежные вопросы