Проверка модельных ограничений - PullRequest
2 голосов
/ 16 августа 2011

Учитывая модель данных на основе общего дерева (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) без жесткого кодирования родительских-дочерних реализаций в методе проверки?

Ответы [ 3 ]

1 голос
/ 16 августа 2011

Я не уверен, насколько это было бы полезно - зависит от того, как вы создаете дерево, но это может сработать:

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

class ProjectModel extends XModel { ... }

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

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

ОБНОВЛЕНИЕ

КомуОтделяя логику валидации от самой модели, вы можете использовать некоторые валидаторы времени выполнения, такие как Hibernate или Spring валидаторы.

0 голосов
/ 16 августа 2011

Я бы использовал дженерики и интерфейсы, которые описывают ограничения

  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 голосов
/ 16 августа 2011

Если вы не хотите помещать эти ограничения в код, вам нужно написать метод проверки, который будет сам обрабатываться некоторыми внешними данными. AFAIK нет такой встроенной опции (в компиляторе), кроме использования Generics, которая потребовала бы, чтобы вы выразили ограничения в коде.

...