2012-03-08 7 views
1

私は既存のプロジェクトにレストインターフェイスを構築しています。このプロジェクトには、約4種類の操作を定義するクラスがあります。各操作では、異なるタイプのオブジェクトを使用してクエリパラメータを定義します。各操作は異なるタイプのオブジェクトを返します。これらのオブジェクトはすべてXML jaxbでエンコードされたオブジェクトであり、最終的にOutputStreamにマーシャリングされます。Javaでジェネリッククラスを使用する適切な時期はいつですか?

私は、URLからパラメータを解析して、さまざまな操作に必要なクエリオブジェクトを構築しています。現在、私は抽象的なQuery親クラスを持っています、QueryFactoryクラスは、クエリの種類を切り替え、URLの要求の種類に固有の子Queryクラスを返します。すべての子問合せクラスは抽象的な「buildQueryParameters」メソッドを実装し、結果をObject型として取得します。

それは得意ですか?パラメータ化された型やジェネリッククラスを使用してクエリパラメータオブジェクトを構築する方法がありますか?私は私のサーブレットコードを検索するためのサブクラスです

:私は自分自身のリクエストタイプを区別するために、すべての私のコードの上にこれらのswitch文を構築し、私はそれが最善の方法だかどうかわからないんだけど...

編集見つけますこのように:

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()メソッドを実装し、要求/操作のそれぞれ異なるタイプのために必要な特定のオブジェクトを作成し、オブジェクトとして返し、マーシャラーは問題の取り扱いを持っていないので、私は必ずしも必要としません戻り値の型をより具体的にする。

+0

私たちにいくつかのコードを表示します。 –

+0

なぜクエリのサブクラス(子クラス)があるのですか?パラメータ名のいくつかの定数を作成し、これらを使用してQueryFactory(実際は* factory(TM)*ではない)/それぞれのメソッドを設定して取得することができます。 –

答えて

0

あなたは、これは何が必要ですあなたは

public class GetStatusQuery extends SOSquery<GetStatusParticularType> { 

を宣言し、サブクラスのために、次にようにprivate T queryParams;

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

と...

public abstract class SOSQuery<T> {宣言し、することができますか?

+0

これは実際のオブジェクト型を返すという追加の利点を提供していますが、私の現在の実装では実際の違いはありません。ただし、私はまだサーブレットのObjectとして取得していますが...まだ実装する価値があります。自分のジェネリッククラスを宣言することのメリットを十分に理解していなかったので、私はそれらを使うことができるかどうか、どうすればいいのか分かりませんでした。私はジェネリック薬の有用性が私を連れて行く限りこれを推測しているので、私はあなたの答えを受け入れるでしょう:) – Bal

0

URLの解析はお勧めしません。すべてのバインディングは、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> 
関連する問題