2016-07-20 11 views
0

ここではJavaのデザインに関する質問はほとんどありません(JEE Webアプリケーションのコンテキストに関係します)。java継承とジェネリックス

たとえば、同じリソースにGETPOSTの2つの操作を持つREST APIがあるとします。そこから、Jacksonの2つのクラスがリクエストの入力フィールドを表すように構築されます。これらのクラスは、リクエストのパラメータが多少異なるために異なります。

はのは、これら2つのクラスが のGetRequestPostRequestを命名されているとしましょう。

これらの2つのクラスには、のフィールドのセットが含まれています。各クラスに属するフィールドのセット。例えば:

public class GetRequest { 

    // common fields 
    private String callerId; 

    private String userId; 

    // non-common fields 
    private boolean withLinkedServices; 

    // Constructors, egals, hasCode, toString, getters,setter etc... 
} 

そして、私のアプリケーションのビジネス層にはクラスのPostRequest

public class PostRequest { 

    // common fields 
    private String callerId; 

    private String userId; 

    // non-common fields 
    private List<ServicesBean> services; 

    // Constructors, egals, hasCode, toString, getters,setter etc... 
} 

、私が使用して別のBeanを記入します(各REST操作用)ヘルパー方法をコーディングする必要が各オブジェクトの共通フィールド。このメソッドの実装は、GET操作とPOST操作ではまったく同じです。

唯一の違いは、GET操作の場合、私はGetRequestクラスを渡さなければならず、POSTのためにはPostRequestを渡さなければならないということです。

だから私の質問は次のとおりです。

私はデータモデルと使用相続に取り組むべきか、私は私のヘルパーメソッドジェネリックを使用する必要がありますか?アプリケーションの将来の進化にどのような意味があり、より効率的で弾力性がありますか?(例えば、そのリソースに多くの操作が追加された場合)

私のメソッドのシグネチャは(POSTのヘルパーのため)である:

public IDaoRequestBean buildDaoRequest(final PostRequest request); 

とgetのヘルパーのために:

public IDaoRequestBean buildDaoRequest(final GetRequest request); 
+0

リード[本](http://stackoverflow.com/questions/2642598/generics-vs-inheritance-when-no-collection-classes-are-involved) –

答えて

1

ジェネリックの使用は実際には必要ありません。両方のクラスに共通のインタフェースを実装する必要があるため、getCallerID/getUserIDを呼び出すことができます。しかし、彼らは共通のインタフェースを実装し、両方持つ、ジェネリック医薬品の必要性を削除します:

interface IRequest { 
    String getCallerID(); 
    String getUserID(); 
} 
/* Overcomplicated, with generics */ 
public <T extends IRequest> IDaoRequestBean buildDaoRequest(final T){...} 

/* Using just the interface */ 
public IDaoRequestBean buildDaoRequest(final IRequest){...} 

ですから、継承で立ち往生かなりです。 abstract class代わりのインタフェースを使用


フィールドとゲッターを再宣言する必要がないという付加的な利点を有しています。他のクラスを拡張することはできないという制限があります。

abstract class BaseRequest { 
    private String callerId; 
    private String userId; 

    // Getters 
} 

class GetRequest extends BaseRequest {...} 
class PostRequest extends BaseRequest {...} 
/* Pretty much the same here... */ 
public IDaoRequestBean buildDaoRequest(final BaseRequest){...} 
0

私は継承が進むべき道だろうと考えています。新しいリクエストがあった場合、ジェネリックスを使用すると、継承につながる同じクラスを継承しない限り、メソッドの実装と一致しないリクエストのタイプを渡すことができる可能性があります。型POSTとGETのスーパークラスの要求だけを持つことで、その2つに制限します。私が間違っているなら、私を修正してください。

0

私の意見では、getメソッドコールのリクエスト本体としてGetRequestを使用しないでください。 get rest呼び出しはId(例:employees/id)に基づいている必要があります。いくつかの理由から あなたのクラス階層で継承をたどるが、であるため

  1. 休息とヘルパーメソッドの実装方法の両方で、あなたのクラス型に特異的であり、その後、リクエストボディにオブジェクトを持っている場合将来、新しい共通属性を追加する必要があるため、このモデルで柔軟性が得られます。

    抽象クラスAbstractRequest

    クラスのGetRequest AbstractRequest {} PostRequestは残りのモデルの引数とヘルパークラスメソッドでもAbstractRequest {}

  2. を拡張

    クラスを拡張{ //共通するのは、 属性}引数として、特定の子タイプをパラメータとして定義しない場合、別の開発者が任意の子タイプの引数でヘルパークラスを呼び出すことができます。これにより、機能が損なわれる可能性があります。したがって、ヘルパーとrestメソッドの引数の型について具体的に記述してください。

    GET - >方法(のGetRequest)

    POST - >方法(PostRequest)

    公共IDaoRequestBean buildDaoRequest(最終PostRequest要求)。

    公開IDaoRequestBean buildDaoRequest(final GetRequest request);