Предоставление библиотеки Java, но скрытие некоторых классов

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

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

Ответ 1

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

class fooBar {
    // do stuff here    
}

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

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

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

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

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

Ответ 2

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

Ответ 3

Да, есть.

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

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

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

Ответ 4

Рассмотрим пример:

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

class B{
//Attribute and Methods

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

}

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

Ответ 5

Если 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

Ответ 6

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