2 Stimmen

Validierung von Modelleinschränkungen

Gegeben ein allgemeines baumbasiertes (Java) Datenmodell. Sagen wir

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;
}

Meine Aufgabe ist es, sicherzustellen, dass FileModels nur in FolderModels (oder PrjectModels) und FolderModels nur in ProjectModels verwendet werden. Da das Modell erweiterbar sein sollte - gibt es eine generische Möglichkeit, diese Einschränkung Validierung zu tun (wie XML-Schema tut) ohne hardcoding die Eltern-Kind-Reaktionen in einer Validierungsmethode?

1voto

denis.solonenko Punkte 11417

Ich bin mir nicht sicher, wie nützlich es wäre - es hängt davon ab, wie Sie den Baum erstellen, aber es könnte funktionieren:

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

Um die Validierungslogik vom Modell selbst zu trennen, können Sie einige Laufzeitvalidatoren verwenden wie Winterschlaf o Frühling Prüfer.

0voto

Thomas Punkte 84982

Wenn Sie diese Einschränkungen nicht in den Code aufnehmen wollen, müssen Sie selbst eine Validierungsmethode schreiben, die mit externen Daten gespeist wird. AFAIK gibt es keine solche eingebaute Option (im Compiler) neben der Verwendung von Generics, die Sie benötigen, um die Einschränkungen in Code ausdrücken würde.

0voto

Liviu T. Punkte 23444

Ich würde Generika und Schnittstellen verwenden, die die Einschränkungen beschreiben

  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 {

  }

Auf diese Weise schränkt das Kind das Elternteil nur auf eine Schnittstelle und nicht auf einen konkreten Typ ein

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X