Пакет и видимость - PullRequest
       44

Пакет и видимость

4 голосов
/ 27 декабря 2011

Я делаю SDK и пытаюсь разделить классы на разные пакеты, эти классы используют некоторые другие общие классы. Проблема в том, что если я сделаю общие классы общедоступными, их смогут увидеть все, не только мои классы. Как правильно сделать их доступными только для моего приложения?

Пример:


пакет MyClass1

Пакет b MyClass2

Пакет с общедоступный MySharedClass


Поскольку c общедоступен, MySharedClass сможет получить к нему доступ, но проблема в том, что он также будет виден миру, как я могу предотвратить это?

Ответы [ 5 ]

3 голосов
/ 27 декабря 2011

Нетривиально:

Общие классы могут определяться общедоступным набором интерфейсов.Фактическая реализация должна быть загружена явно через Classloader.После этого просто примените механизмы управления безопасностью Java для контроля доступа к классам реализации.Любой может увидеть интерфейсы, и доступ к реальной реализации будет ограничен вашим SDK.

(Разновидность выше - это то, что должен делать каждый сервер веб-приложений. Как вы думаете, Tomcat не позволяет вам получить доступ к "общедоступным" классам некоторых приложений?)

edit: примечание вышеэто механизм времени выполнения.Есть и статические (пост) компиляции.APT, например, может быть эффективным здесь.Естественно, я говорю не о реструктуризации вашего пакета (в OP), а только о том, как обеспечить безопасный доступ к общему подходу.Но они немного «хакерские» - механизм загрузки классов во время выполнения каноничен и, пожалуй, более корректен.

3 голосов
/ 27 декабря 2011

Создайте пакет, который задокументирован как внутренний пакет, который не будет использоваться клиентами.

В Java нет способа сделать класс общедоступным только для определенных пакетов: либо public для всех, либо пакет-приват (общедоступный только в объявленном пакете).

Я думаю, что есть предложение для модулей , которое позволит лучше контролировать видимость классов, но нам придется подождать, по крайней мере, Java 8.

3 голосов
/ 27 декабря 2011

Все пакеты являются «общедоступными» в Java, и вы можете защитить классы внутри пакета.Чтобы ограничить видимость класса только данным пакетом, объявите его следующим образом ( без public модификатор видимости):

class MyClass {
    // ...
}

Таким образом, только классы втот же пакет, что и MyClass, сможет его увидеть.

1 голос
/ 27 декабря 2011
Защищенный модификатор

можно использовать, если ваш класс получит доступ только в том же пакете.в противном случае нет возможности.

1 голос
/ 27 декабря 2011

Если класс совместно используется классами из двух разных пакетов, это может быть хорошим признаком того, что эти два класса должны находиться в одном пакете вместе с разделяемым классом, который не будет общедоступным и, следовательно, будет использоваться только по классам одной и той же упаковки.

Если это действительно не вариант, просто документируйте общий класс соответствующим образом, чтобы указать, что он не должен использоваться вне внутреннего кода SDK, что он может быть изменен в будущих версиях, и сделайте его еще яснее, назвав пакет "внутренний" или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...