Инспекция патерна Singleton для Idea


Самая интеллектуальная IDE Идея сегодня стала ещё умней. А всё потому что я вот написал для неё плагинчик-инспекцию который проверяет корректность применения шаблона проектирования Одиночка (англ. Singleton). Так сказать, внёс лепту в борьбу с говнокодом. Исходники кстати доступны из репозитория на GitHub.

Скриншотик

Итак, ним проверяется что:

  • Класс-одиночка имеет приватный конструктор чтобы не допустить создания извне его экземпляра и наследования
  • Класс-одиночка желательно должен быть финальным — это позитивно влияет на производительность, и опять таки перестраховка от его наследования.
  • Метод getInstance() должен быть публичным, статическим и возвращать экземпляр своего класса. А как ведь иначе?

Проверка является ли класс одиночкой делается в лоб — по наличию метода getInstance(). Не очень красиво, хотя будет ещё некрасивее если у вас он будет называться по другому.

Для решения этой проблемы можно использовать аннотации. В Groovy, например, уже давно есть стандартная аннотация @Singleton, которой можно пометить класс-одиночку. И в Идее даже есть инспекция которая проверяет одиночки определяя их по этой аннотации.

Для Явы уже есть целая библиотека аннотаций шаблонов проектирования JPatterns. У меня в планах наделать проверок для остальных шаблонов проектирования анализируя аннотации этой либы. Так что to be continued.

Кстати синглтоны не так уж и просты, как кажутся. Особенно те что с ленивой инициализацией. В частности стандартный синглтон создаваемый идеей не рассчитан на многопоточность.

P.S. А ещё getInstance() может принимать параметры, эта ситуация нормальна и просто игнорируются этой инспекцией.

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s