这个问题扩展到了abstract-class-numberformat-very-confused-about-getinstance的问题。我觉得这个问题不同,值得单独提问。
在该问题的答案中,有人声称代码声明如
NumberFormat en = NumberFormat.getInstance(Locale.US);
返回一个对象,该对象是java.text.NumberFormat
类的子类。这对我来说是有道理的,为什么返回类型不能只是 NumberFormat
的一个实例,因为它是一个抽象类。相反,有人声称返回的对象至少是NumberFormat
的一个实例,但实际上是别的。
我的问题是:具体是返回的对象的类是什么?在Sun文档中,我看到的唯一子类是ChoicesFormat
和DecimalFormat
。是否有某种幕后编译器伏都教会在这里发生?
提前致谢!
答案 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)