2012-03-08 81 views
1

我在現有的項目中構建了一個休息接口。該項目有一個類定義了大約4種不同類型的操作。每個操作都採用不同類型的對象來定義查詢參數。每個操作都會返回一個不同類型的對象,所有這些對象都是XML jaxb編碼對象,並最終被編組爲一個OutputStream。什麼時候在Java中使用泛型類

我正在解析URL中的參數,並構建各種操作所需的查詢對象。目前,我有一個抽象查詢父類,這是一個QueryFactory類,它在查詢類型之間切換,並返回特定於URL中請求類型的子查詢類。所有的子查詢類都實現了一個抽象的「buildQueryParameters」方法,並以Object類型的形式得到結果。

這樣就好嗎?有一些奇特的方式來使用參數化類型或泛型類來構建我的查詢參數對象嗎?我發現自己建立這些switch語句都在我的代碼的請求類型之間的區別,我不知道這是最好的辦法......

編輯:

我的子類,因爲我的servlet代碼如下像這樣:

Query query = QueryFactory.getInstance(parameterMap, requestEnum); 
query.buildQueryParams(); 
Object queryParams = query.getQueryParams(); 

查詢工廠是非常直截了當:

public static Query getInstance(Map<String, String> parameterMap, RequestEnum requestEnum) { 
     switch (requestEnum) { 
      case GETSTATUS: { 
       return new GetStatusQuery(parameterMap); 
      } 
      case DESCRIBEOPS: { 
       return new DescribeOpsQuery(parameterMap); 
      } 
      case GETSTATUSBYID: { 
       return new GetStatusByIdQuery(parameterMap); 
      } 
      case GETEVENTS: { 
       return new GetEventsQuery(parameterMap); 
      } 
      default: 
       break; 
     } 
     return null; 
    } 

抽象查詢類也是無聊:

public abstract class Query { 

    protected Map<String, String> validatedMap; 
    private Object queryParams; 

    public SOSQuery(Map<String, String> parameterMap) { 
      this.parameterMap = parameterMap; 
     } 

     public Object getQueryParams() { 
      return this.queryParams; 
     } 

     public abstract void buildQueryParams(); 

     protected void setQueryParams(Object queryParams) { 
      this.queryParams = queryParams; 
     } 

     protected Map<String, String> getParameterMap() { 
      return this.parameterMap; 
     } 

每個子類都實現了buildQueryParams()方法,併爲每個不同類型的請求/操作創建所需的特定對象,並將它們作爲對象返回,而編組沒有問題處理,所以我不一定需要更具體的返回類型。

+0

我們看一些代碼。 – 2012-03-08 21:54:30

+0

爲什麼你有查詢子類(子類)呢?您可以爲參數名稱創建一些常量,然後使用這些常量設置並在QueryFactory中設置正確的值(然後再不是真正的*工廠(TM)*)/相應的方法。 – 2012-03-08 21:57:37

回答

0

你可以聲明public abstract class SOSQuery<T> {然後private T queryParams;

public T getQueryParams() { 
    return this.queryParams; 
} 

等等...

的子類,你將宣佈

public class GetStatusQuery extends SOSquery<GetStatusParticularType> { 

這是你需要什麼?

+0

那麼,即使它提供了返回實際對象類型的額外好處,儘管我仍然只是將它作爲我的servlet中的一個對象來使用,但這並不會對我當前的實現產生任何實際影響......但我認爲它仍然值得實施。我想因爲我沒有完全理解聲明我自己的泛型類的好處,所以我不確定是否或如何使用它們。我猜這只是仿製藥的用處會帶給我的,所以我會接受你的回答:) – Bal 2012-03-08 22:31:34

0

我不會推薦自己解析網址。所有綁定可以使用JAXB和JAX-RS自動完成。

例子:

定義服務:

@Path("/app") 
@Produces("application/xml") 
public interface TestService {  
    @POST 
    @Consumes("text/xml") 
    @Path("/addType") 
    public Policy setTypePolicy(Policy p); 

    @GET 
    @Path("/server/{server}/service") 
    public Services getTypesOnServer(@PathParam("server") String serverName); 
} 

定義模型:

<element name="policy"> 
    <complexType> 
    <sequence> 
      <element name="name" type="string" /> 
      ... 
     </sequence> 
    </complexType> 
</element> 
相關問題