给定基于通用树的(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;
}
我的挑战是确保FileModel仅用于FolderModels(或PrjectModels),而FolderModels仅用于ProjectModels。 由于模型应该是可扩展的 - 是否有任何通用的方法来执行此约束验证(如XML Schema所做的那样),而无需在验证方法中对父子项进行硬编码?
答案 0 :(得分: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> { ... }
更新
答案 1 :(得分:0)
如果您不想将这些约束放入代码中,则必须自己编写一些由某些外部数据提供的验证方法。 AFAIK除了使用Generics之外,没有这样的内置选项(在编译器中),这需要你在代码中表达约束。
答案 2 :(得分: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 {
}
这样,子进程只将父进程限制为接口而不是具体类型