別のフォーラムで、コンストラクターを使用するまれなケースについての議論に出くわしました。クラスのコンストラクターを呼び出すために、クラスの独自のサンドボックスの外側のコードを禁止することは良い設計と見なされることをどこかで読んだことを思い出しました。引数は、可変数の引数を受け入れるように定義されたスーパークラス コンストラクターの呼び出しに関連していましたが、問題の特定の言語では、一般的にコンストラクターの関数呼び出しが許可されていません。
誰がいつ言ったのかは覚えていませんが、敬意を表した情報源だった気がしますが、私の記憶は私を裏切るかもしれません. 言語の詳細はさておき、これはメタ言語の優れた実践として理にかなっているでしょうか、それともこれはただの作り上げられたルール/一般的な推奨事項であるにはあまりにも個人的なものですか?
以下は、私が考えることができるいくつかの正当化です:
言語に関係なく、通常、作成されるオブジェクトに固有の初期化順序に問題があり、外部コードはこれらの特殊性を認識していない可能性があります/これらの特殊性を公開すると、オブジェクトの実装の詳細が漏洩していると見なされる場合があります。
コンストラクター内のエラーは、自動メモリ管理のない言語で問題を引き起こします。外部コードにそのようなエラーを管理させることは、ほぼ保証された失敗/メモリリークです。
多くの場合、継承では、スーパークラスからサブクラスを参照できる必要があります (匿名で、たとえば、抽象メソッドを呼び出すことによって - これが問題になる Java を考えてください) (必ずしも匿名ではない)。つまり、スーパークラスがそのフィールドで関数を呼び出す場合、それらのフィールドをサブクラス内の特定の他の値に事前に初期化する必要がある場合があります。また、サブクラスでスーパークラスの初期化の結果を使用する必要がある場合もあります。これには、コンストラクターへの「フック」が必要になる場合がありますが、「裸の」コンストラクターを外部コードに公開する場合は不可能です (このような場合、外部コードは規則の外側で動作することによりオブジェクトの作成に影響を与える可能性があるため)。初期化中とその時期。