Есть ли когда-нибудь выравнивание для “антишаблона псевдоопределения типа”?

Единственная вещь, которую я изменил бы о той реализации Singleton (кроме не использования Singleton вообще) состоит в том, чтобы сделать финал поля экземпляра. Статическое поле будет инициализировано однажды на загрузке класса. Так как классы загружаются лениво, Вы эффективно получаете ленивое инстанцирование бесплатно.

, Конечно, если это загружается из отдельных загрузчиков класса, Вы получаете несколько "одиночных элементов", но это - ограничение каждой одноэлементной идиомы в Java.

РЕДАКТИРОВАНИЕ : новые () и doPreparations () биты действительно смотрят подозреваемый все же. Разве они не могут быть перемещены в конструктора одноэлементного экземпляра?

10
задан McDowell 9 April 2011 в 11:37
поделиться

6 ответов

Настоящая проблема в том, что эта идиома создает сильную связь между вашим псевдотипом и вашим клиентским кодом. Однако , поскольку вы используете FooBarMap в частном порядке, реальных проблем связывания нет (это детали реализации).

NB

Современная Java IDE должна обязательно помочь в работе со сложными универсальными типами.

5
ответ дан 3 December 2019 в 19:34
поделиться

ИМО, проблема с анти-шаблонами Java в том, что они поощряют черно-белое мышление.

На самом деле, большинство анти-шаблонов имеют нюансы. Например, в связанной статье объясняется, как псевдотипы приводят к API-интерфейсам, сигнатуры типов которых слишком строгие, слишком привязаны к конкретным решениям реализации, вирусным и т. Д. Но это все в контексте общедоступных API. Если вы держите определения псевдотипов вне общедоступных API (т.е. ограничиваете их классом или, возможно, модулем), они, вероятно, не причинят реального вреда и могут сделать ваш код более читабельным.

Моя точка зрения заключается в том, что вам необходимо понять антишаблоны и сделать собственное обоснованное суждение о том, когда и где их избегать. Просто занимая позицию, что "

12
ответ дан 3 December 2019 в 19:34
поделиться

Для общедоступных интерфейсов мне не нравятся общие типы, потому что они не имеют значения. Мне кажется, что метод с аргументом HashMap > очень похож на методы C, такие как foo (int, int, int, void *, int) и так далее. Наличие реального типа упрощает чтение кода. Для общедоступного интерфейса было бы лучше создать FooBarMap, который обертывает HashMap >, а не typedef, но для внутреннего использования внутри класса я не вижу никаких недостатков.

3
ответ дан 3 December 2019 в 19:34
поделиться

Без этого псевдотипа я бы предпочел написать

private Map<Long,Map<Integer,String>>[] maps;

, и если я когда-нибудь решу изменить реализующий класс с HashMap на TreeMap или Java7GreatEnhancedWonderfulMap :-) ничего не сломается. Но с этим вы застряли с HashMap. Что ж, вы можете сделать:

interface FooBarMap extends Map<Long,Map<Integer,String>> { };
class FooBarHashMap extends HashMap<Long,Map<Integer,String>> implements FooBarMap{ };

, но он становится все более громоздким.

0
ответ дан 3 December 2019 в 19:34
поделиться

Если вы используете его только в небольшом локализованном блоке кода, проблемы будут небольшими, правда.

Дело в том, что и выгоды тоже: ваша программа, вероятно, даже не получит текстовый меньше, пока вы не укажете pseudo-typedef 5+ раз, что означает, что область, в которой он виден, должна быть нетривиальной.

Я, вероятно, не стал бы переписывать код, который делал это, но это кажется плохой привычкой. .

0
ответ дан 3 December 2019 в 19:34
поделиться

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

Но я не вижу веских причин не использовать ее локально, при условии, что она облегчает вам жизнь и код более читабелен - и вы известно, что ты делаешь. Брайан может обобщать и категорически не рекомендовать это в любой ситуации, но это его чувство Гетца: p

0
ответ дан 3 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: