2

クラスのコンストラクターが次のようになっているJavaコードを見ています。

public class X extends ... {
    X(String s) {
       super(new Y(s)); 
    }
}

それはいつも間違っていますか?言い換えれば、コンストラクターでオブジェクトを作成して、それを「スーパー」に渡すのは常に間違っているのでしょうか。もしそうなら、なぜですか?

編集:なぜ私はそれが間違っていると思うのですか?

クラスXを作成するとき、jvmが最初に行うことは、そのスーパークラスでsuperを呼び出すことです。(「super()」が暗黙指定されている場合でも実行されます)super(new Y(s)); 三項演算子を使用したsuperの呼び出しなど、限られた量の操作しか実行できませsuper( s != null ? new Y(s) : new Y() ) んが、superを最初に呼び出す必要があるため、これ以上ロジックを配置することはできません。 !!! だから私はそれが間違っていると思います

4

5 に答える 5

3

いいえ、必ずしも間違っているわけではありません。スーパークラスがコンストラクターで指定できるものをサブクラスがロックすることは完全に有効です。


あなたの編集を再:

...しかし、呼び出しているため、これ以上ロジックを配置することはできませんsuper...

それは本当で、これは Java プログラミング言語の制限 (意図的なものだと思います) ですが、だからといってに渡すオブジェクトを作成することが常に間違っsuperているわけではありません。

superまた、必要に応じて、渡す必要があるものを返す静的関数を定義して呼び出すことにより、その制限を回避できます。

super(makeTheThingYouNeed());

その時点、私はそれを使用する前に、これが本当に私の最善の行動方針であることを再確認します. しかし、それを渡すために特別にオブジェクトを作成するだけsuperですか? まったく問題ありません。

于 2013-03-05T17:12:14.883 に答える
0

常に間違っているわけではありませんが、いつものように、虐待を防ぐための措置が必要です。

この場合、新しいYオブジェクトが String のラッパーであるsか、または のスーパークラスで必要とされるある種のオブジェクトであるかのように見えますX。スーパークラスの初期化値を提供し、必要に応じてそれらを適応させるだけです。

Yオブジェクトは のコンストラクターで作成するかX、パラメーターとして直接提供することができます (のコンストラクターは の代わりに をX受け取ります)。たとえば、 の作成は、を作成するオブジェクトからアクセスできないクラスであれば問題ありません。YStringYX

ご覧のとおり、すべてはコーディングしている現在のコンテキストの問題です。まさにそのコンテキストによって、決定がどの程度間違っているかが決まります。

于 2013-03-05T17:14:06.913 に答える
0

それは「常に」間違っているわけではありません。それは「ほとんど」間違っていたり、間違っていたりすることさえありませ。さらに言えば、子クラスがそのように情報を渡すことはかなり一般的ですsuper。しかし、他の状況がどうなっているのか疑問に思う人もいますが、これらのほとんどは練習自体とはほとんど関係がありません.

これは、クラスのより広範な初期化を回避する方法ですか? それから多分それは悪い考えです。コードの読み取り/デバッグが難しくなりますか? それなら捨てた方がいいかもしれません。

また、それはいつも間違っていると誰が言ったのか、なぜそんなことを言ったのかも気になります。それは仲間の開発者でしたか?同級生?インストラクター?「コンストラクター内での初期化が間違っている」と断定的に言うのは、私が今まで見たことのないものですが、学生や教授が言っていることは想像できます。

于 2013-03-05T17:14:47.237 に答える
0

いいえ、必ずしも間違っているわけではありません。たとえば

public class A {
  public A(final BigDecimal value) {}
}

public class B extends A {
  public B(final String value) {super(new BigDecimal(value));}
}

これを行うには多くの理由が考えられます。変数の変換 (上記のように) や、インスタンス化protectedしかBできないクラスのインスタンスをスーパークラスが取得する場合などです。

常に間違っていることはほとんどありませんが、多くのことが時々間違っています...

于 2013-03-05T17:14:58.663 に答える
0

言語的な意味で間違っているわけではありません。Xただし、コンストラクターが完全に異なるタイプの引数を取る場合、 とそのスーパークラスの間にサブクラスの関係があることに一貫性がないように見えるため、おそらく「においがします」(コメントに入れるように) 。

これは、コーディングの実践というよりは、オブジェクト指向の設計哲学に関係する主観的な問題です。コードとして、サブクラスがオブジェクトを作成できるデータの型を制限することは完全に合理的です。実際、これを行うことは非常に一般的です。

于 2013-03-05T17:18:36.693 に答える