【发布时间】:2020-06-25 13:42:26
【问题描述】:
我正在编写一个类库,其中包含一个名为 Application 的类。 Application 类包含 Document 对象的集合。我希望 Application 类在适当的时候单独负责“创建”(构造)Document 对象。我不希望我自己或我们的其他开发人员能够任意构造新的Document 对象。
我试图想出一些可靠的方法来强制执行此操作,但我只想出了几种可能性,它们都有缺点。
第一种方法是将Application 类嵌套在Document 类中,并使Document 构造函数私有,这样只有Application 类可以访问它。但这在结构上毫无意义,实际上与真正的关系相反。更不用说通常不鼓励公共嵌套类。
我尝试的另一种方法是将Document 构造函数设为私有,但给它一个公共的“工厂方法”,它会进行一些检查以确保它确实被Application 调用。但是当我尝试实现它时,这变得非常复杂。
我是否过于复杂了?当然,构建代码库以使开发人员可以做他们不应该做的事情是很常见的事情吗?我是否应该期望我们的开发人员(和我自己)在应该从Application 获取它们时使用谨慎和常识而不是四处构建新的Document 对象? p>
或者我在尝试执行此操作时是否正确?我是否正确地追求课程只能按预期使用?毕竟,这首先是访问级别的用途——强制仅在正确的上下文中使用实体。如果这是一个合理的追求,是否有人对在这种情况下如何做到这一点有任何建议?
注意:我发现了这个类似的线程:java - make class only instantiable from specific class。但是建议的解决方案是嵌套类,由于我上面给出的原因,这不是一个好的选择。
【问题讨论】:
-
你可以创建一个公共的新接口
IDocument,然后在Application内部使用private内部Document类实现它? -
如果他们在同一个项目中,你可以让你的构造函数
internal -
您可以将这些类移动到它们自己的项目中并使用
internal。这可以通过反射和AssemblyInfo设置来回避,但如果有人以您不想要的方式构建它们,那就很清楚了。 -
Application类无论如何都不应该调用构造函数——它应该被传递一个抽象工厂方法,它用来这样做,尽管这对你的问题没有帮助。但是,我认为您正试图对其进行过度设计。 -
@DRoam 该模式称为Dependency Injection。我可以推荐this book,这是我工作的地方必读。 author's blog 也有一些有趣的东西。