абстрактный класс NumberFormat - очень запутался в getInstance () - PullRequest
4 голосов
/ 13 марта 2010

Я новичок в Java, и у меня есть вопрос новичка:

NumberFormat - абстрактный класс, и поэтому я предполагаю, что не могу сделать его экземпляр. Но есть публичный статический (фабричный?) Метод getInstance(), который позволяет мне делать

NumberFormat nf = NumberFormat.getInstance();  

Я совсем запутался. Я буду рад, если кто-то может дать мне подсказки:

  1. Если есть открытый метод для получения экземпляра этого абстрактного класса, почему у нас нет и конструктора?
  2. Это абстрактный класс; как мы можем иметь этот статический метод, дающий нам экземпляр класса?
  3. Почему выбирают такой дизайн? Если я предполагаю, что возможно иметь экземпляр абстрактного класса (???), я не понимаю, почему этот класс должен быть абстрактным вообще.

Спасибо.

Ответы [ 2 ]

8 голосов
/ 13 марта 2010

На самом деле, что вы можете получить от

public static final NumberFormat getInstance()

- это то, что ТАКЖЕ a NumberFormat, но это конкретный экземпляр его подкласса.

В любом случае вы не можете создать экземпляр абстрактного класса, чтобы метод не мог вернуть простой NumberFormat, но что-то, что не менее a NumberFormat. В этом случае метод используется для получения средства форматирования по умолчанию для вашей локали, которое, вероятно, будет DecimalFormat или некоторые его варианты

В документации DecimalFormat говорится:

Чтобы получить NumberFormat для конкретный язык, в том числе по умолчанию локаль, позвоните одному из NumberFormat заводские методы, такие как деЫпзЬапсе (). В общем, не звоните конструкторы DecimalFormat напрямую, так как NumberFormat фабричные методы могут возвращать подклассы кроме десятичного формата.

В завершение: вы можете быть уверены, что если оно абстрактное, то вы не можете создать его экземпляр, ни сама Java не может ..., так как в объявлении отсутствуют некоторые части, поэтому это настоящий неполный тип.

8 голосов
/ 13 марта 2010
  1. Класс является абстрактным, потому что он является базовым классом для каждого числового формата в Java (например, включая DecimalFormat). Наличие конструктора для практически неизвестного числового формата довольно бесполезно.
  2. Метод getInstance() - это так называемый фабричный метод . Возвращает соответствующий формат числа для текущей локали. Поскольку неизвестно, какой подкласс требуется во время компиляции, он возвращает NumberFormat, однако сам экземпляр , очевидно, будет подтипа (поскольку вы можете не создавать экземпляры абстрактных классов).
  3. Этот дизайн дает вам возможность каким-то образом определять правильный экземпляр подкласса для возврата во время выполнения, не делая слишком большую часть этого проекта жесткой во время проектирования / компиляции. Статические методы освобождаются от абстрактности, поэтому класс может работать как фабрика и как абстрактный супертип для конкретных реализаций. Если бы это было не так, у вас, вероятно, где-то был бы NumberFormatFactory, в котором были бы фабричные методы.
...