【问题标题】:Parent/child model for DTODTO 的父/子模型
【发布时间】:2012-01-22 13:53:04
【问题描述】:

我不确定这种情况是否与 generics 相关而不是 DTOs,但这里是这样的:

我有一个代表 Person 的 DTO。 Person 可以拥有其他 Person 作为子项,或者只是 ResourceLink 到这些 Person强>(S)。这意味着孩子可以是以下两种类型之一:Person(DTO)或ResourceLink。它将是什么类型,通过 queryParam 确定,因此在逻辑上通过以下流程确定。我想只使用 ONE 集合对象来表示它们,但我不知道这样做的最佳方式。

这是我目前所拥有的:

public class PersonDTO<T> {

    @XmlElementWrapper(name = "children")
    @XmlElement(name = "child")
    List<T> children;
    // other stuff

}

使用这种方法,我需要根据if...else 条件定义翻译后的类型。

之前我有 2 个不同的集合,其中一个仍然 NULL。我还想过在新的 DTO 中提取 relationship 东西作为 ChildrenDTO(不确定这是否是个好主意)

我想知道这种情况是否有最佳实践,否则,是否可以根据条件声明PersonDTO&lt;PersonDTO&gt;PersonDTO&lt;ResourceLink&gt;

提前致谢!

【问题讨论】:

    标签: jersey parent-child dto


    【解决方案1】:

    我建议改为对 List children 的元素使用第三种类型:

        public interface PersonResolver () {
              Person resolvePerson ();
        }
    
        public class Person implements PersonResolver {
              Person resolvePerson () { return this; }
        }
    
        public class ResourceLink implements PersonResolver {
              Person resolvePerson () {
                   if (myLinkTargetType == TARGET_TYPE_PERSON)
                          { return (Person) myTarget; }
                   return null;
              }
        }
    

    【讨论】:

    • 请原谅我迟到的回复。感谢回复。这不会将两个不相关的类型放在同一个继承树中吗?不过,如果一个方法要返回一个 Person,它现在应该返回一个 PersonResolver,对吗?所以它必须被转换回所需的类型才能正确使用,对吧?
    • 这里的想法是,只存储 PersonResolver 类型。然后可以将 Person 解析为自身 (Person a; a.resolvePerson() == a),而您的 ResourceLink 类型将解析为其链接的人 (ResourceLink b; b.resolvePerson() == (Person)b.getTargetOfLink())。 — 这允许使用像List&lt;PersonResolver&gt; 这样的容器,方法是允许所有子级正交产生Person,而不是if (x instanceof Person) 等。至于“继承树”,它只是一个接口——它制作要关联的类型;而不是将两种不相关的类型放入一个容器中……
    • 所以Person必须有一个PersonResolver,它可以引用PersonResourceLink,我们不在乎它是什么,因为它会被处理在运行时。我对这里的 IsA 东西不满意,因为我正在寻找更多 HasA 类型的东西。但我很感谢你抽出时间来回答。我将它标记为已接受,不幸的是,我自己想到了一个没有解析器的接口;但不想关联不相关的对象。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 2021-04-22
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多