2012-03-08 96 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> 
相关问题