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

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

Время на прочтение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?
Теги:
Хабы:
+1
Комментарии16

Публикации

Истории

Работа

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

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