2012-04-20 7 views
1

私はこのコードをよりエレガントで効率的なコードに変換しようとしていました。次のJavaコードスニペットを書き直す方法

ContentSlotForPageModelContentSlotForTemplateModelCMSRelationModelのサブタイプです
final ContentSlotForPageModel rel = modelService.create(ContentSlotForPageModel.class); 
rel.setUid("rel_1"); 
rel.setPosition("no"); 
rel.setCatalogVersion(catalogVersionModel); 
rel.setPage(firstContentPage); 
rel.setContentSlot(slot); 
modelService.save(rel); 

final ContentSlotForTemplateModel relTemplate = modelService.create(ContentSlotForTemplateModel.class); 
relTemplate.setUid("relTemplate_1"); 
relTemplate.setPosition("no"); 
relTemplate.setCatalogVersion(catalogVersionModel); 
relTemplate.setPageTemplate(template); 
relTemplate.setContentSlot(slot); 
modelService.save(rel); 

。だから私はこのようにそのスーパータイプを使用してこれらの属性を設定するメソッドを作成しようとしました:

private void setRelationModel(final CMSRelationModel rel, final ContentSlotModel slot, final String id) 
{ 
    rel.setUid(id); 
    rel.setCatalogVersion(catalogVersionModel); 

    if (rel instanceof ContentSlotForPageModel) 
    { 
     ((ContentSlotForPageModel) rel).setPage(firstContentPage); 
     ((ContentSlotForPageModel) rel).setContentSlot(slot); 
     ((ContentSlotForPageModel) rel).setPosition("no"); 
    } 
    else if (rel instanceof ContentSlotForTemplateModel) 
    { 
     ((ContentSlotForTemplateModel) rel).setPageTemplate(template); 
     ((ContentSlotForTemplateModel) rel).setContentSlot(slot); 
     ((ContentSlotForTemplateModel) rel).setPosition("no"); 
    } 

    modelService.save(rel); 

} 

しかし、多くの方法がCMSRelationModelに定義されていないので、私は右の呼び出しを行うために検証を作成する必要があります。スーパークラスでこのメソッドを定義することはできません。これを書くにはより良い方法がありますか?

ありがとうございました

+0

私は十分に明確ではないかもしれません。このメソッドを呼び出す方法は問題ではありません。それは、setRelationModelメソッドをより一般的なものにする方法の問題です。私は繰り返す必要はありません:setPage、setContentSlot。このようにして検証をスキップします – Bartzilla

答えて

1

、次の操作を行うサンプルです。
いいえinstanceof、厳密に型指定された、重複したコードの最小化。

private void setRelationModel(ContentSlotForPageModel rel, ContentSlotModel slot, String id) { 
    rel.setPage(firstContentPage); 
    rel.setContentSlot(slot); 
    rel.setPosition("no"); 
    setCMSRelationModel(rel); 
} 

private void setRelationModel(ContentSlotForTemplateModel rel, ContentSlotModel slot, String id) { 
    rel.setPageTemplate(template); 
    rel.setContentSlot(slot); 
    rel.setPosition("no"); 
    setCMSRelationModel(rel); 
} 

private void setCMSRelationModel(CMSRelationModel rel, String id) { 
    rel.setUid(id); 
    rel.setCatalogVersion(catalogVersionModel); 
    modelService.save(rel); 
} 

「コードノイズ」を減らすためにパラメータからfinalも削除しました。

0

それらの間に新しいスーパークラスを作成できますか?

public abstract class SuperContentSlotModel extends CMSRelationModel{ 
    private String position; 
    private ContentSlotModel slot; 
    //... 
} 

class ContentSlotForPageModel extends SuperContentSlotModel{ 
    private int page; 
    //... 
} 

また、あなたの代わりにinstanceofのオーバーロードメソッドを使用することができます。

private void setRelationModel(final ContentSlotForPageModel rel, final ContentSlotModel slot, final String id){ 
    //... 
} 
private void setRelationModel(final ContentSlotForTemplateModel rel, final ContentSlotModel slot, final String id){ 
    //... 
} 
0

あなたはこれを試してみてくださいでした...すべての

まず、あなたはCMSRelationModelから継承されたフィールドを入力します、 instanceof演算子を使用するなど、子クラスに基づいてフィールドに値を設定します。ここで

private void setRelationModel(final CMSRelationModel rel, final ContentSlotModel slot, final String id) 
{ 
    rel.setUid(id); 
    rel.setCatalogVersion(catalogVersionModel); 
    rel.setContentSlot(slot); // assume this is inherited method from CMSRelationModel 
    rel.setPosition("no"); // assume this is inherited method from CMSRelationModel 

    if (rel instanceof ContentSlotForPageModel) 
    { 
     ((ContentSlotForPageModel) rel).setPage(firstContentPage); 
    } 
    else if (rel instanceof ContentSlotForTemplateModel) 
    { 
     ((ContentSlotForTemplateModel) rel).setPageTemplate(template); 
    } 

    modelService.save(rel); 
} 
関連する問題