使用抽象java.text.NumberFormat类的getInstance()方法时,返回值的实际类是什么?

时间:2010-05-17 16:02:04

标签: java text abstract number-formatting

这个问题扩展到了abstract-class-numberformat-very-confused-about-getinstance的问题。我觉得这个问题不同,值得单独提问。

在该问题的答案中,有人声称代码声明如

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

返回一个对象,该对象是java.text.NumberFormat类的子类。这对我来说是有道理的,为什么返回类型不能只是 NumberFormat的一个实例,因为它是一个抽象类。相反,有人声称返回的对象至少NumberFormat的一个实例,但实际上是别的。

我的问题是:具体是返回的对象的类是什么?在Sun文档中,我看到的唯一子类是ChoicesFormatDecimalFormat。是否有某种幕后编译器伏都教会在这里发生?

提前致谢!

4 个答案:

答案 0 :(得分:3)

未指定特定类型,因为它可以是NumberFormat的任何子类。它甚至可能取决于您使用的语言环境。某些语言环境可能需要ChoiceFormat才能正确实现,对于其他语言环境DecimalFormat就足够了,对于第三个语言环境,它们甚至可能返回特定于语言环境的实现。

事实上,它没有比抽象基类更具体地定义,这样就可以在实现中进行这种更改,而无需更改方法签名以适应这种更改。

您可以通过在返回值上调用getClass()轻松验证一个特定呼叫返回的具体类型。

答案 1 :(得分:2)

这是工厂模式的一个例子。

API设计者不希望要求调用者知道NumberFormat的具体子类型。如果调用者“关心”可以返回哪些具体类,那么像操作的instanceof开始出现的邪恶事物。当这样的事情发生时,调用者突然“紧密耦合”到具体的子类而不仅仅是“接口”(其中接口可以表示Java接口,抽象类或甚至其他一些非最终类)。

大多数OO倡导者都希望你拍摄“高封装,松耦合”。

答案 2 :(得分:0)

为什么不跑......

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

......找出来?

答案 3 :(得分:0)

使用Beanshell中的Jedit控制台,我得到以下内容:

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

我会说该调用会返回DecimalFormat。