В этой главе рассказывается о модификаторах доступа Scala. Члены пакетов, классов или объектов могут быть помечены как закрытые и защищенные модификаторы доступа, и если мы не используем ни одно из этих двух ключевых слов, доступ будет считаться общедоступным. Эти модификаторы ограничивают доступ членов к определенным областям кода. Чтобы использовать модификатор доступа, вы включаете его ключевое слово в определение членов пакета, класса или объекта, как мы увидим в следующем разделе.
Частные Члены
Закрытый член виден только внутри класса или объекта, который содержит определение члена.
Ниже приведен пример фрагмента кода для объяснения частного участника:
пример
class Outer { class Inner { private def f() { println("f") } class InnerMost { f() // OK } } (new Inner).f() // Error: f is not accessible }
В Scala доступ (новый Inner). f () недопустимо, потому что f объявлен как private во Inner, и доступ не изнутри класса Inner. Напротив, первый доступ к f в классе Innermost в порядке, потому что этот доступ содержится в теле класса Inner. Java разрешает оба доступа, потому что позволяет внешнему классу обращаться к закрытым членам своих внутренних классов.
Защищенные участники
Защищенный член доступен только из подклассов класса, в котором этот член определен.
Ниже приведен пример фрагмента кода для объяснения защищенного члена:
пример
package p { class Super { protected def f() { println("f") } } class Sub extends Super { f() } class Other { (new Super).f() // Error: f is not accessible } }
Доступ к f в классе Sub в порядке, потому что f объявлен защищенным в классе ‘Super’, а класс ‘Sub’ является подклассом Super. В отличие от этого, доступ к f в классе «Other» не разрешен, поскольку класс «Other» не наследуется от класса «Super». В Java последний доступ будет по-прежнему разрешен, поскольку класс «Other» находится в том же пакете, что и класс «Sub».
Публичные участники
В отличие от закрытых и защищенных членов, не требуется указывать ключевое слово Public для открытых членов. Не существует явного модификатора для открытых участников. К таким членам можно получить доступ откуда угодно.
Ниже приведен пример фрагмента кода для объяснения открытого участника:
пример
class Outer { class Inner { def f() { println("f") } class InnerMost { f() // OK } } (new Inner).f() // OK because now f() is public }
Степень защиты
Модификаторы доступа в Scala могут быть дополнены классификаторами. Модификатор формы private [X] или protected [X] означает, что доступ является частным или защищенным «до» X, где X обозначает некоторый включающий пакет, класс или одноэлементный объект.
Рассмотрим следующий пример —
пример
package society { package professional { class Executive { private[professional] var workDetails = null private[society] var friends = null private[this] var secrets = null def help(another : Executive) { println(another.workDetails) println(another.secrets) //ERROR } } } }
Примечание — следующие пункты из приведенного выше примера —
Переменная workDetails будет доступна для любого класса в рамках пакета специалистов.
Переменные друзья будут доступны для любого класса в рамках общества пакета.
Секреты переменных будут доступны только для неявного объекта в методах экземпляра (this).