Как стать автором
Обновить

Идея расширения модификаторов доступа

Время на прочтение2 мин
Количество просмотров2.5K

Проблема


Я — параноик. Кода я пишу код, я скрываю все переменные, методы и классы, которые только могу скрыть. Я стараюсь открыть лишь те методы и классы, которые необходимы.

Довольно часто, особенно при написании подсистем, скрыть те или иные методы и классы довольно непросто. Неприятности начинаются, кода подсистема достаточно большая, и для лучшей организации кода необходимо завести несколько под-пакетов.
Например, если есть класс com.system.InternalProperty, который используется и в com.system.persist.PropertyManager, и в com.system.network.PropertyUpdater, то InternalProperty должен быть объявлен public.

В этом посте я постараюсь рассказать о существующих решениях и предложить новую идею.



Существующие решения


1. Поместить все классы в один пакет. Использовать дефолтный модификатор доступа для внутренних объектов. Например:
class InternalProperty
{
  private final int c;

  InternalProperty(int c)
  {
    this.c = c;
  }

  int getC()
  {
    return c;
  }
}


* This source code was highlighted with Source Code Highlighter.


2. Сделать конструктор класса видимым внутри текущего пакета, а сам класс и его методы сделать public. Тогда пользователь не сможет сам создать экземпляр такого класса. В нашем примере, это будет выглядеть так:
public class InternalProperty
{
  private final int c;

  InternalProperty(int c)
  {
    this.c = c;
  }

  public int getC()
  {
    return c;
  }
}


* This source code was highlighted with Source Code Highlighter.


Моя идея


Было бы здорово, если бы в следующем релизе Java включили бы специальную аннотацию @VisibleIn. Эта аннотация помещалась бы на класс, поле класса или метод и расширяла бы область видимости объекта. Мой код выглядел бы тогда вот так:
@VisibleIn("com.system.network")
@VisibleIn("com.system.persist")
class InternalProperty
{
 private final int c;

 InternalProperty(int c)
 {
  this.c = c;
 }

 int getC()
 {
  return c;
 }
}


* This source code was highlighted with Source Code Highlighter.


То есть класс InternalProperty был бы виден и в своём пакете, и в com.system.network, и в com.system.persist.

Эта аннотация использовалась бы и на этапе компиляции, и на этапе исполнения.

Хотели бы вы видеть что-то подобное в Java? В чем недостатки @VisibleIn?
Теги:
Хабы:
Всего голосов 9: ↑5 и ↓4+1
Комментарии16

Публикации

Истории

Работа

Java разработчик
395 вакансий

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
24 сентября
Astra DevConf 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн