Какие существуют модификаторы доступа для классов? Какая разница между ними?android-37

В Java и Kotlin существуют различные модификаторы доступа, которые определяют видимость классов и их членов. Понимание этих модификаторов критически важно для правильного проектирования Android-приложений.

1. Основные модификаторы доступа

public

public class PublicClass {  // Виден везде
    public int publicField;
}

Характеристики:

  • Класс виден из любого другого класса
  • Используется для API, который должен быть доступен извне
  • В Android: Activity, Service, BroadcastReceiver обычно public

package-private

class PackagePrivateClass {  // Виден только в своем пакете
    int packagePrivateField;
}

Характеристики:

  • Видимость в пределах пакета
  • Не требует ключевого слова (просто отсутствие модификатора)
  • В Android: вспомогательные классы, внутренняя реализация

protected

public class BaseClass {
    protected int protectedField;  // Виден наследникам
}

Важно: Для классов в Java модификатор protected не применяется (только для членов класса)

private

public class OuterClass {
    private class InnerClass {  // Виден только внутри OuterClass
        private int privateField;
    }
}

Характеристики:

  • Видимость только внутри объявляющего класса
  • Часто используется для внутренней реализации

2. Особенности в Kotlin

Kotlin изменяет некоторые правила Java:

internal class InternalClass {  // Виден в пределах модуля
    internal val internalField: Int = 0
}
  • internal - новая видимость (виден в пределах модуля)
  • private - виден только внутри файла (для top-level объявлений)
  • По умолчанию - public (в отличие от Java)

3. Сравнительная таблица

Модификатор Java Kotlin Android Use Case
publicВиден вездеВиден вездеActivity, Fragment, Public API
package-privateВиден в пакете (default)Нет (используется internal)Внутренние хелперы
protectedТолько для членов классаВиден в классе+наследникахБазовые классы компонентов
privateВиден в классеВиден в классе/файлеВнутренняя реализация
internalНетВиден в модулеМодульная архитектура

4. Практические рекомендации для Android

  1. Минимизируйте public доступ:

    • Используйте минимально необходимую видимость
    • public только для компонентов, которые должны быть доступны извне
  2. Использование internal:

    internal class DatabaseHelper  // Виден только внутри модуля data
    
    • Отлично подходит для модульной архитектуры
    • Защищает реализацию от случайного использования
  3. Вложенные классы:

    • private для полностью скрытой реализации
    • protected практически не используется для классов
  4. Пример из Android SDK:

    public abstract class View {
        protected void onMeasure() {...}  // Для переопределения наследниками
        private void dispatchDraw() {...} // Внутренняя реализация
    }
    

Резюмируем:

Выбор модификатора доступа зависит от требуемого уровня инкапсуляции. Public - для публичного API, private/internal - для скрытия реализации, protected - для наследников. Правильное использование модификаторов делает код более безопасным и поддерживаемым.