Проблема
Я — параноик. Кода я пишу код, я скрываю все переменные, методы и классы, которые только могу скрыть. Я стараюсь открыть лишь те методы и классы, которые необходимы.
Довольно часто, особенно при написании подсистем, скрыть те или иные методы и классы довольно непросто. Неприятности начинаются, кода подсистема достаточно большая, и для лучшей организации кода необходимо завести несколько под-пакетов.
Например, если есть класс
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?