2011-08-16 15 views
2

ジェネリックツリーベースの(Java)データモデルが与えられました。さんはモデル制約の検証

abstract class XModel { 
    long id; 
    XModel parent; 
} 

class ProjectModel extends XModel { 
    String customer; 
} 

class FileModel extends XModel { 
    String name; 
} 

class FolderModel extends XModel { 
    String name; 
    String attributes; 
} 

私の挑戦はFileModelsのみFolderModels(またはPrjectModels)で使用されていることを確認することであり、FolderModelsのみProjectModelsで使用されているとしましょう。 モデルは拡張可能でなければならないので、バリデーションメソッドで親子関係をハードコーディングせずに(XML Schemaのように)この制約検証を行う一般的な方法はありますか?

答えて

0

私は制限事項について説明ジェネリックとのインターフェイスを使用することになり

interface Model { 

    } 

    abstract class AbstractModel<P extends Model> implements Model { 

    Long id; 
    P parent; 
    } 

    class ProjectModel extends AbstractModel implements HasFileModel, 
     HasFolderModel { 

    } 

    interface HasFileModel extends Model { 
    } 

    static class FileModel extends AbstractModel<HasFileModel> { 

    } 

    interface HasFolderModel extends Model { 

    } 

    class FolderModel extends AbstractModel<HasFolderModel> implements 
     HasFileModel { 

    } 

子だけあまりにも私の好みの方法だろうインターフェイスではない具体的なタイプ

0

これらの制約をコードに入れたくない場合は、自分で外部データを入力する検証メソッドを記述する必要があります。 AFAIKではGenericsを使用する以外に(コンパイラ内に)そのような組み込みオプションはありません。これは、コードで制約を表現する必要があります。

1

は、私はそれが可能だろうか役に立つか分からない - あなたがツリーを作成する方法によって異なりますが、これはうまくいくかもしれない:

abstract class XModel<T extends XModel> { 
    long id; 
    T parent; 
} 

class ProjectModel extends XModel { ... } 

class FolderModel extends XModel<ProjectModel> { ... } 

class FileModel extends XModel<FolderModel> { ... } 

UPDATE

はモデル自体あなたをから検証ロジックを分離するためにHibernateまたはSpringバリデータのような実行時バリデータを使用できます。

+0

+1に親を制限し、この方法ではなく、私は親子関係を厳格にすることなく「恐れている」と思う。 – Thomas

関連する問題