Scala - модификаторы доступа

В этой главе вы познакомитесь с модификаторами доступа Scala. Члены пакетов, классов или объектов могут быть помечены модификаторами доступа как private и protected, и если мы не используем ни одно из этих двух ключевых слов, то доступ будет считаться общедоступным. Эти модификаторы ограничивают доступ членов к определенным областям кода. Чтобы использовать модификатор доступа, вы включаете его ключевое слово в определение членов пакета, класса или объекта, как мы увидим в следующем разделе.

Частные члены

Частный член виден только внутри класса или объекта, содержащего определение члена.

Ниже приведен пример фрагмента кода для объяснения частного члена -

пример

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 объявлен закрытым во 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 последний доступ по-прежнему будет разрешен, потому что класс «Другой» находится в том же пакете, что и класс «Подкласс».

Публичные члены

В отличие от закрытых и защищенных членов, не требуется указывать ключевое слово 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
         }
      }
   }
}

Note - следующие пункты из приведенного выше примера -

  • Переменная workDetails будет доступна любому классу в прилагаемом пакете professional.

  • Переменные друзья будут доступны любому классу внутри окружающего пакета.

  • Секреты переменных будут доступны только для неявного объекта в методах экземпляра (this).