Предоставление библиотеки Java, но скрытие некоторых классов - PullRequest
13 голосов
/ 10 июля 2011

Я занимаюсь разработкой приложения на Java ME, которое хочу предоставить в виде библиотеки. Разве нет способа скрыть классы, которые я не хочу, чтобы все использовали, но все же необходимо, чтобы библиотека работала?

UPDATE: Я понял, что могу опустить публичный спецификатор, но как я могу структурировать саму библиотеку при разработке без создания разных пакетов? Мне нравится рассматривать разные пакеты как разные папки просто, что позволяет мне правильно структурировать код. Однако в некоторых случаях мне может понадобиться доступ к классам в других пакетах, так что это довольно сложно. Что на самом деле представляет пакет? Одной из идей может быть создание «интерфейсов», но они должны быть объявлены общедоступными, чтобы иностранцы могли также реализовывать интерфейсы, предназначенные только для некоторых процессов внутри библиотеки, верно?

Ответы [ 6 ]

4 голосов
/ 15 июля 2011

Для настройки библиотеки API вы хотите защитить все, что вы не хочу подвергаться Для этого просто опустите модификатор доступа:

class fooBar {
    // do stuff here    
}

Это установит доступ к классу как «по умолчанию», который разрешает доступ из в том же пакете, а также из любых классов, которые подкласс fooBar.

В ваших классах вы также захотите заблокировать любой доступ к вашим методам и членам, отметив их private, protected или опуская модификатор так, чтобы они были «по умолчанию», как требуется.

  • private разрешит доступ только из содержащего класса;
  • 'default' (без модификатора) позволяет изнутри содержащего класса и содержащего пакета; и
  • protected разрешит доступ из того же класса, пакета и любых подклассов.

Для всего, что вы выставили (public), также полезно пометить его как final, если оно не предназначено для переопределения.

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

1 голос
/ 10 июля 2011

Вы можете сделать классы package protected, которые могут видеть только другие классы в том же пакете. Если это невозможно, то вы можете использовать ProGuard для манипулирования классами и скрытия их реализаций.

0 голосов
/ 18 октября 2017

Если возможна Java 9, используйте Jigsaw modules .Если нет, поместите каждый класс в один и тот же пакет с доступом на уровне пакета для скрытых классов и используйте модули Maven для их организации.

Я сделал именно это в своем проекте под названием coronata , Java-библиотека Wii Remote.Почти все классы находятся в пакете com.github.awvalenti.bauhinia.coronata, но в разных модулях (которые отображаются как проекты в IDE).

Видимые классы являются открытыми.Они находятся в модулях:

  • coronata-api
  • coronata-builder
  • coronata-demos
  • coronata-lib

Скрытые классы имеют доступ на уровне пакета.Они находятся в модулях:

  • coronata-common
  • coronata-implementation-bluecove
  • coronata-implementation-wiiusej
0 голосов
/ 11 июля 2011

Давайте рассмотрим пример:

Если у вас есть класс A, который вы хотите скрыть, и класс B, который использует функциональные возможности класса A, то вы можете сделать это:

class B{
//Attribute and Methods

    //Inner class A
    class A{
      //Methods and Attributes.
    }

}

После этого вы можете создать Объект класса A внутри метода класса B и, следовательно, использовать его. Хотя класс будет скрыт от других классов, он все еще может быть использован.

0 голосов
/ 11 июля 2011

Да, есть.

Просто не объявляйте эти классы public. Другими словами, опустите ключевое слово public, например, так:

class Internal { // rather than "public class Internal"
    ...
}

По умолчанию классы доступны только в пакете, где они определены.

0 голосов
/ 10 июля 2011

Вам нужно сделать классы, которые вы не хотите, чтобы они были защищены.Это сделает их неиспользуемыми из клиентского кода.Подробнее в официальных документах

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