什么时候在Java中使用泛型类

时间:2012-03-08 21:50:15

标签: java generics parameterized

我正在现有项目中构建一个休息界面。该项目有一个类,它定义了大约4种不同类型的操作。每个操作都使用不同类型的对象来定义查询参数。每个操作都返回一个不同类型的对象,所有对象都是XML jaxb编码对象,最终被编组到OutputStream。

我正在解析URL中的参数并构建各种操作所需的查询对象。目前,我有一个抽象的Query父类,一个QueryFactory类,它在查询类型之间切换,并返回一个特定于URL中请求类型的子Query类。所有子查询类都实现了一个抽象的“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;
    }

抽象的Query类也很无聊:

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()方法并创建每个不同类型的请求/操作所需的特定对象,并将它们作为对象返回,marshaller处理没有问题,因此我不一定需要更多具体的返回类型。

2 个答案:

答案 0 :(得分:0)

您可以声明public abstract class SOSQuery<T> {然后private T queryParams;

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

依旧......

您要声明的子类

public class GetStatusQuery extends SOSquery<GetStatusParticularType> {

这就是你需要的吗?

答案 1 :(得分: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>