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