Java中的嵌套数据结构(内部类)

Java中的嵌套数据结构(内部类),java,data-structures,inner-classes,Java,Data Structures,Inner Classes,在我们的应用程序中,方法通常返回嵌套的数据结构。我们将它们表示为DTO,其中一个DTO可能包含其他DTO或其列表。所讨论的方法主要为GUI提供要显示的内容 到目前为止,“内部”DTO是常规公共类的对象。开发人员试图在各种其他DTO类中重用这些内部DTO。虽然这看起来像是一个受欢迎的代码重用应用程序,但它只在松散关联的方法之间创建了不必要的依赖关系 避免这种情况的一种方法是“展平”DTO,这样就根本没有嵌套,所有属性都是简单的标量类型。但是,在许多情况下,这似乎是不自然的,例如,当外部和内部DTO

在我们的应用程序中,方法通常返回嵌套的数据结构。我们将它们表示为DTO,其中一个DTO可能包含其他DTO或其列表。所讨论的方法主要为GUI提供要显示的内容

到目前为止,“内部”DTO是常规公共类的对象。开发人员试图在各种其他DTO类中重用这些内部DTO。虽然这看起来像是一个受欢迎的代码重用应用程序,但它只在松散关联的方法之间创建了不必要的依赖关系

避免这种情况的一种方法是“展平”DTO,这样就根本没有嵌套,所有属性都是简单的标量类型。但是,在许多情况下,这似乎是不自然的,例如,当外部和内部DTO之间存在1:n关系时,导航这样的DTO将变得更加麻烦

所以我们认为,我们可以创建内部类(外部DTO类)的“内部”DTOs实例。这应该以更少的代码重用为代价来减少依赖性

但是我们注意到,除非我们将内部类公开,否则无法从外部访问内部类的方法(例如,返回这样一个DTO的方法)。但是,任何人都可以创建这个内部类的实例(尽管它不那么吸引人)

因此,基本问题是:

  • 以完全自包含的方式表示嵌套数据结构的好方法是什么

    • 你可以按你的建议去做。如果要阻止其他人创建实例,可以将构造函数包设置为本地或私有。如果类也是公共的,则可以在任何地方访问这些方法,但只能在允许的地方构造它们

    • 您可以使用内部类,但要使它们实现公共接口
    • 我推荐的解决方案之一是使用标准方法(将公共类作为字段),但禁止开发人员将这些类与方面策略一起使用(这里是我找到的简短教程:)。使用方面,您可以做两件事:
      • 禁止使用您的类
      • 告诉开发人员为什么他们不能使用它(使用策略警告文本)

    • 通过使内部类的构造函数私有,可以很容易地避免从外部创建内部类,因此只有封闭类可以创建某些内部类的新实例。