4

この質問は、abstract-class-numberformat-very-confused-about-getinstanceの質問を拡張したものです。この質問は、それだけで質問する価値があるほど異なっていると思います。

その質問への回答では、次のようなコードステートメントが述べられていました

NumberFormat en = NumberFormat.getInstance(Locale.US);

クラスのサブクラスであるオブジェクトを返しますjava.text.NumberFormat。それが抽象クラスであるため、return型が単なるインスタンスではない理由は私には理にかなっています。むしろ、返されるオブジェクトは少なくとものインスタンスであるNumberFormatと述べられていましたが、実際には別のものです。NumberFormat

私の質問はこれです:返されるオブジェクトのクラスは具体的に何ですか?Sunのドキュメントでは、私が見るサブクラスはChoicesFormatとだけDecimalFormatです。ここで行われているコンパイラのブードゥーの舞台裏のようなものはありますか?

前もって感謝します!

4

4 に答える 4

3

特定のタイプは、の任意のサブクラスである可能性があるため、指定されていませんNumberFormat。使用するロケールによっても異なる場合があります。一部のロケールではChoiceFormat、正しく実装する必要がある場合があります。他DecimalFormatのロケールでは十分であり、3番目のロケールでは、ロケール固有の実装を返す場合もあります。

抽象基本クラスよりも具体的に定義されていないという事実により、このような変更に対応するためにメソッドのシグネチャを変更することなく、実装でこの種の変更を行うことができます。

戻り値を呼び出すことにより、 1回の特定の呼び出しでどの具象型が返されるかを簡単に確認できgetClass()ます。

于 2010-05-17T16:10:12.453 に答える
2

これはファクトリパターンの例です。

API設計者は、呼び出し元にNumberFormatの具体的なサブタイプを知っていることを要求したくありませんでした。呼び出し元がどの具体的なクラスが返されるかを「気にする」場合、instanceof演算子のような邪悪なものが現れ始めます。そのようなことが起こると、突然、呼び出し元は「インターフェース」だけでなく、具体的なサブクラスに「緊密に結合」されます(インターフェースは、Javaインターフェース、抽象クラス、またはその他の非最終クラスを意味する場合があります)。

ほとんどのOO支持者は、「高度なカプセル化、緩い結合」を求めて撮影することを望んでいます。

于 2010-05-17T16:12:23.070 に答える
0

走ってみませんか...

System.out.println(NumberFormat.getInstance(Locale.US).getClass().getName());

...そして見つけますか?

于 2010-05-17T16:03:42.077 に答える
0

JeditでBeanshellコンソールを使用すると、次のようになります。

BeanShell> import java.text.NumberFormat;
BeanShell> NumberFormat en = NumberFormat.getInstance(Locale.US);
BeanShell> en.getClass().getName();
java.text.DecimalFormat

その呼び出しによってDecimalFormatが返されると言えます。

于 2010-05-17T16:07:09.323 に答える