私はクラスを拡張し、このクラスのメソッドをオーバーライドすると言う。なぜ、私の新しいクラスのコンストラクタからオーバーライドされたメソッドを呼び出すのが悪い習慣ですか?Java継承質問
Q
Java継承質問
3
A
答えて
12
5
コンストラクタで作業を行うのは悪い習慣です。オブジェクトの依存関係を取得して割り当てるだけです。
3
あなたのクラスから継承し、コンストラクタに依存する動作を変更することができます。
これは、あなたがその機能が何をしようとしているのかわからないことを意味します。
3
結果のクラスのインスタンスが矛盾した状態になる可能性があるためです。ここに具体例があります。
public class Foo {
private int number;
public Foo() {
number = 42;
multiplyNumber();
}
public void multiplyNumber() {
number = number * 2;
}
public int getNumber() {
return number;
}
}
public class Bar extends Foo {
private int number;
public Bar() {
multiplyNumber();
}
@Override
public void multiplyNumber() {
number = number * 3;
}
}
public class FooBar {
public static void main(String[] args) {
Foo foo = new Foo();
Foo bar = new Bar();
System.out.println("Foo number 1 = " + foo.getNumber()); // Returns 84
System.out.println("Foo number 2 = " + bar.getNumber()); // Returns 42;
}
}
私のマシン上でデバッグを走る、bar
は実際には、コンストラクタでmultiplyNumber()
メソッドを呼び出すことはありません。それはちょうどスキップされます。結果として、オブジェクトは期待値がnumber
にありません。
コンストラクタは単純な生き物でなければなりません。非常に複雑なものを置かないことをお勧めします。
1
コンストラクタでオーバーライド可能なメソッドを呼び出すとします。再度サブクラス化して再度オーバーライドします。 2番目のサブクラスは、最初のサブクラスが完全に初期化されているとみなされる作業を中断し、破損した状態にすることがあります。
コンストラクタでの作業です。あなたは仕事をすることができます。通常は、あなたのオブジェクトを初期化するために必要な仕事のタイプでなければなりません。
継承を避けるために、コンストラクタの処理をメソッドに分割する場合は、可視性修飾子を使用して、すべての作業が構築中のクラスに対してローカルになるようにします。
関連する問題
- 1. Javaの継承質問
- 2. Djangoの継承の質問
- 3. 継承多型質問
- 4. C++の継承の質問
- 5. NHibernateの継承の質問
- 6. C++の継承の質問
- 7. CSSコントロールの継承 - 継承他のコントロールスタイル私の質問に
- 8. ナイーブ継承問題 - Java
- 9. CSS継承の質問のクイックカップル
- 10. cpp継承に関する質問
- 11. Java ORM:複数(継承)継承
- 12. Java継承TextArea
- 13. クラス継承java
- 14. Java継承
- 15. 継承に関する問題(java)
- 16. Java Swing | AbstractTableModelを継承し、JTableで使用する|いくつかの質問
- 17. Javaのジェネリック/継承
- 18. Javaコレクションインタフェースの継承
- 19. プライベートコンストラクタと継承(Java)
- 20. java JAXBと継承
- 21. のJava:継承コンストラクタ
- 22. Qtシグナルと継承に関する質問
- 23. Rubyのデザインパターンの質問 - クラスは/モジュール継承
- 24. 本当に簡単なJavaScriptを「継承」(質問の例)
- 25. リスト(T)クラスから継承する質問
- 26. 継承関係についての概念的な質問?
- 27. EF4 - カスタムObjectContextと継承に関する質問
- 28. 初心者のPHPクラスの継承に関する質問
- 29. 継承とOOPについての質問C#
- 30. データベース設計の質問、継承を使用して
なぜそれは悪い習慣だと思いますか?それはおそらく状況に依存します... –
Netbeansはそれに下線を付け、私に警告を与えます – user489041
OK、警告は何ですか? – gatkin