Как пакеты (packages) в Java помогают управлять пространством имен и контролировать доступ?

«Как пакеты (packages) в Java помогают управлять пространством имен и контролировать доступ?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Пакеты в Java предоставляют два ключевых механизма защиты и организации:

1. Управление пространством имен (Name Space Management)

Пакеты предотвращают конфликты имен классов. Классы с одинаковыми именами могут сосуществовать в разных пакетах.

package com.company.payments;
public class Validator { /* Логика для платежей */ }

package com.company.users;
public class Validator { /* Логика для пользователей */ }
// Использование с полным именем
com.company.payments.Validator paymentValidator = new com.company.payments.Validator();

2. Контроль доступа (Access Protection)

Пакеты являются важной границей для модификаторов доступа:

  • package-private (модификатор по умолчанию): Элемент виден только классам внутри того же пакета. Это уровень доступа по умолчанию для классов, интерфейсов, полей и методов, если не указан public, protected или private.
  • protected: Поля и методы доступны классам того же пакета и подклассам (даже из других пакетов).

Практический пример инкапсуляции:

package com.example.data.utils;
// Вспомогательный класс, скрытый внутри пакета.
class InternalConnectionPool { // package-private
    static Connection getConnection() { ... }
}

// Публичный API пакета.
public class DatabaseService {
    public void executeQuery(String sql) {
        Connection conn = InternalConnectionPool.getConnection(); // Доступ есть
        // ...
    }
}

// В другом пакете этот вызов НЕ скомпилируется:
// com.example.ui.App:
// InternalConnectionPool.getConnection(); // ОШИБКА: InternalConnectionPool is not public

Таким образом, пакеты позволяют скрывать служебную реализацию, предоставляя наружу только публичный контракт.