2010-03-13 2 views
4

Я новичок в Java, и я начинающий вопрос:абстрактный класс NumberFormat - очень путать о GetInstance()

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

NumberFormat nf = NumberFormat.getInstance(); 

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

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

Спасибо.

ответ

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

Благодарим вас за ответ. Если бы вы могли разработать или дать мне ссылку на пример того, что вы написали в третьей части: «не делая слишком много этого дизайна жестким во время проектирования/компиляции», было бы здорово! С уважением. – Alex

+0

@Alex: Это предпосылка многих так называемых «шаблонов проектирования». В некоторых ситуациях жесткая иерархия классов и их отношения слишком негибкая, чтобы работать должным образом. Вы либо отказываетесь от гибкости, либо создаете себе кошмары для обслуживания, если вам нужно изменить или расширить дизайн. 600 символов слишком коротки, чтобы дать осмысленное введение, но Wikipedia имеет некоторую информацию об этом (http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29). Для многих из них основным принципом является не моделирование отношений между объектами как части классов (во время компиляции), а скорее – Joey

+0

... отложить это до времени выполнения, когда у вас тогда будет гораздо больше гибкости при объединении нескольких классов в единую рабочую система. В этом случае конструктор потребует от вас знать, какой конкретный подкласс «NumberFormat» вам нужен, потому что конструктор 'NumberFormat' не может создать объект« DecimalFormat ». Вы абстрагируетесь здесь от необходимости знать, что * * подклассы *, используя фабричный метод для создания объекта. Метод просто создает подкласс «NumberFormat», который выбирается в зависимости от языкового стандарта. – Joey

8

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

public static final NumberFormat getInstance() 

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

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

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

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

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

+0

Спасибо за ваш ответ. – Alex

Смежные вопросы