抽象类NumberFormat - 对getInstance()非常困惑

时间:2010-03-13 13:34:35

标签: java abstract-class instantiation

我是Java新手,我有一个初学者问题:

NumberFormat是一个抽象类,所以我假设我无法创建它的实例。但是有一个允许我做的公共静态(工厂?)方法getInstance()

NumberFormat nf = NumberFormat.getInstance();  

我很困惑。如果有人能给我提示,我会很高兴:

  1. 如果有一个公共方法来获取这个抽象类的实例,为什么我们还没有一个构造函数呢?
  2. 这是一个抽象类;我们怎么能有这个静态方法给我们一个类的实例?
  3. 为什么选择这样的设计?如果我假设它有可能有一个抽象类的实例(???),我不明白为什么这个类应该是抽象的。
  4. 谢谢。

2 个答案:

答案 0 :(得分:8)

  1. 该类是抽象的,因为它是Java中每种数字格式的基类(例如,这包括DecimalFormat)。拥有一个基本未知数字格式的构造函数是没用的。
  2. getInstance()方法是所谓的factory method。它返回当前语言环境的匹配数字格式。由于不知道在编译时需要什么类的子类,它返回NumberFormat,但是,实例本身将是一个子类型,显然(因为你不能创建抽象类的实例。)
  3. 这种设计使您可以灵活地以某种方式确定在运行时返回的正确子类实例,而不会在设计/编译时使设计过于严格。静态方法不受抽象的限制,因此类可以作为工厂用于具体实现的抽象超类型。如果情况并非如此,那么你可能会在某处拥有NumberFormatFactory工厂方法。

答案 1 :(得分:8)

实际上你可以从

获得什么
public static final NumberFormat getInstance()

ALSO a NumberFormat,但它是它的子类的具体实例。

你不能以任何方式实例化一个抽象类,这样方法就不能返回一个普通的NumberFormat,而是至少一个NumberFormat。在这种情况下,该方法用于获取您的语言环境的默认格式化程序,该格式化程序可能是DecimalFormat或其某些变体

DecimalFormat的文档中指出:

  

获取a的NumberFormat   特定区域设置,包括默认值   locale,调用NumberFormat之一   工厂方法,如   的getInstance()。一般来说,不要打电话   DecimalFormat构造函数   直接,自NumberFormat   工厂方法可能会返回子类   除了DecimalFormat。

结束:你可以肯定,如果它是抽象的,那么你就无法实例化它,Java本身也不能......因为声明缺少某些部分所以它是一个真正不完整的类型。