2016-08-10 7 views
0

Javaでは、非finalクラスのコンストラクタは、抽象メソッドでも非finalでも、すべてのインスタンスメソッドを呼び出すことができます。Javaは、コンストラクタが抽象メソッドと非最終メソッドを呼び出すことを許可するのはなぜですか?

これは悪い習慣(例えば、Effective Java 2nd Edition、Item 17を参照)として認識され、定義されたコンストラクタの順序のためにC++では不可能です。

なぜ私はこのことがJava言語の設計から始めることが許されたのですか?言語の制限として禁じられているように思えました。これを行う必要がある場合はありますか?

+1

コンパイルが難しくなります。 [それをしないでください](http://stackoverflow.com/questions/15327417/is-it-ok-to-call-abstract-method-from-constructor-in-java) –

+0

どのようにコンパイルするのですかより困難?言語が "コンストラクタがprivateまたはfinalインスタンスメソッドを呼び出すことができる"のような制限がある場合、コンパイル時に検証するのは簡単なようです。 私はこれを広範に行うレガシーコードをたくさん探しているので、これがなぜ始まったのか不思議です。 – Uri

+0

これは 'this'を漏らすのと同じ理由で悪い習慣です – oldrinb

答えて

1

Java言語を使用すると、それを禁止する明白な理由がないため、特に今日のJavaのベストプラクティスが当初の設計時に必ずしも知られていなかったと考えれば、それは許されます。

抽象メソッドまたは非finalメソッドを呼び出すコンストラクタが機能することに注意してください。サブクラスがこのメソッドをオーバーライドする可能性があります。また、コンストラクタが新しく作成されたサブクラスのインスタンススーパークラスにサブクラス化する)。

私が知る限り、それをする必要はありません。しかし、確かに、悪い習慣であると知られているにもかかわらず、そこにあるサードパーティ製のライブラリがあります。

+0

"コンストラクタは、(サブクラスからスーパークラスへのコンストラクタの実行順序のために)新しく作成されたサブクラスのインスタンスで実行されている可能性があります。" - これは間違いの理由です。オブジェクトのインスタンスメソッドを呼び出す前に完全に初期化されました – oldrinb

+0

私が最初にC++(Java導入前)を学んだ日に、あらかじめ定義された構築順序(parent-> child)に関する議論は、親コンストラクタが子プロセスに対して仮想メソッドを呼び出す複雑さ子状態はまだ有効ではありません。だから、元のデザインにこの問題が少なくともある程度認識されていたように思えます。 – Uri

関連する問題