Для чего нужны пакеты (package) в Java?

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

Ответ

Пакеты в Java — это механизм для организации пространства имен и управления видимостью классов и интерфейсов. Они решают несколько ключевых задач:

  1. Организация и структурирование кода

    • Логическая группировка связанных классов (например, com.company.service, com.company.dao, com.company.ui).
    • Соответствие структуре каталогов в файловой системе: класс com.example.Main должен находиться в файле com/example/Main.java.
  2. Предотвращение конфликтов имен (Name Collision)

    • Классы с одинаковыми простыми именами могут сосуществовать в разных пакетах (например, java.util.Date и java.sql.Date).
  3. Управление доступом (Access Control)

    • Модификатор protected предоставляет доступ классам внутри того же пакета и подклассам.
    • Модификатор доступа по умолчанию (package-private) делает член видимым только внутри своего пакета.

Пример объявления и использования:

// Файл: com/example/utils/StringHelper.java
package com.example.utils; // Объявление пакета

public class StringHelper {
    public static String reverse(String s) {
        return new StringBuilder(s).reverse().toString();
    }
}
// Файл: com/example/Main.java
package com.example;

import com.example.utils.StringHelper; // Импорт класса из пакета
// или import com.example.utils.*; // Импорт всех классов из пакета

public class Main {
    public static void main(String[] args) {
        // Использование класса по полному имени (FQN)
        String result = StringHelper.reverse("Hello");
        System.out.println(result); // "olleH"
    }
}

Соглашения: Имена пакетов обычно строятся в обратном DNS-формате (например, com.google.gson) для гарантии уникальности.