Учебники

Scala — Модификаторы доступа

В этой главе рассказывается о модификаторах доступа 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).