При использовании метода getInstance () абстрактного класса java.text.NumberFormat, каков фактический класс возвращаемого значения? - PullRequest
4 голосов
/ 17 мая 2010

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

В ответах на этот вопрос было указано, что такое кодовое выражение, как

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

возвращает объект, который является подклассом класса java.text.NumberFormat. Для меня имеет смысл, почему возвращаемый тип не может быть просто экземпляром NumberFormat, поскольку это абстрактный класс. Скорее было заявлено, что возвращаемый объект является по крайней мере экземпляром NumberFormat, но на самом деле что-то еще.

Мой вопрос таков: каков конкретно класс возвращаемого объекта? В документации Sun единственные подклассы, которые я вижу, это ChoicesFormat и DecimalFormat. Есть ли здесь какой-то закулисный компилятор вуду?

Заранее спасибо!

Ответы [ 4 ]

3 голосов
/ 17 мая 2010

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

Тот факт, что он не определен более конкретно, чем абстрактный базовый класс, допускает такого рода изменения в реализации без необходимости изменять сигнатуру метода, чтобы учесть такое изменение.

Вы можете легко проверить, какой конкретный тип возвращается с помощью одного конкретного вызова , вызвав getClass() возвращаемого значения.

2 голосов
/ 17 мая 2010

Это пример заводской модели.

Разработчики API не хотели, чтобы вызывающая сторона знала конкретный подтип NumberFormat. Если вызывающая сторона «заботится» о том, какие конкретные классы могут быть возвращены, начинают появляться злые вещи, такие как оператор instanceof. Когда происходят подобные вещи, внезапно вызывающая сторона «тесно связана» с конкретным подклассом, а не только с «интерфейсом» (где интерфейс может означать интерфейс Java, абстрактный класс или даже какой-то другой неконечный класс).

Большинство сторонников ОО хотят, чтобы вы стреляли из-за "высокой инкапсуляции, слабой связи".

0 голосов
/ 17 мая 2010

Используя консоль Beanshell в Jedit , я получаю следующее:

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

Я бы сказал, что DecimalFormat возвращается этим вызовом.

0 голосов
/ 17 мая 2010

Почему бы не бежать ...

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

... а узнать?

...