在另一个论坛上,我遇到了关于使用构造函数的一些极端情况的争论,我记得在某处读到过,禁止类自己的沙箱之外的代码调用该类的构造函数将被认为是一个很好的设计。该参数与调用定义为接受可变数量参数的超类构造函数有关,而所讨论的特定语言通常不允许调用构造函数。
我不记得是谁在什么场合这么说的,但我觉得这是一个值得尊重的来源,尽管我的记忆可能会出卖我。抛开语言细节不谈,这作为一种元语言的良好实践是否有意义,或者这只是一个虚构的规则/过于个人化而不能作为通用推荐?
以下是我能想到的一些理由:
无论使用哪种语言,初始化顺序通常都存在问题,这通常是正在创建的对象所特有的,外部代码可能不知道这些特殊性/暴露这些特殊性可能会被视为泄漏对象的实现细节。
构造函数内部的错误会给没有自动内存管理的语言带来困难。让外部代码管理此类错误几乎可以保证失败/内存泄漏。
继承通常要求我们都能够从超类引用子类(匿名,例如通过调用抽象方法 - 想想 Java,这是有问题的)和返回(不一定是匿名的)。即,如果超类在其字段上调用函数,我们可能需要将这些字段预初始化为子类中的某些其他值,当然,我们可能需要在子类中使用超类初始化的产物。这可能需要在构造函数中添加“钩子”,但如果我们将“裸”构造函数暴露给外部代码(因为在这种情况下,外部代码可能会通过在约定之外工作而影响对象创建),这是不可能的正在初始化以及何时。