English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Доступные модификаторы Scala

Ограничители доступа в Scala в основном такие же, как и в Java,分别是: private, protected, public.

Если не указан уровень доступа, по умолчанию уровень доступа объектов Scala составляет public.

Ограничитель private в Scala stricter, чем в Java, и в случае вложенных классов даже внешние классы не могут доступа к частным членам вложенных классов.

Члены Private

используя ключевое слово private, члены, помеченные этим знаком, видны только в классе или объекте, содержащем их определение, и та же rule применяется к внутренним классам.

class Outer{
    class Inner{
    private def f(){ println("f") }
    class InnerMost{
        f() // правильно
        }
    }
    (new Inner).f() // ошибка
}

доступ не законен, потому что f в Inner был объявлен как private, а доступ не в классе Inner.

но при доступе из InnerMost f нет проблем, потому что этот доступ включает在内 классе Inner.

Java позволяет这两种 доступа, потому что он позволяет внешним классам доступ к частным членам внутренних классов.

Защищенные (Protected) члены

В Scala доступ к защищенным (Protected) членам stricter, чем в Java. Потому что он позволяет доступ к защищенным членам только в подклассах, определивших этот член. В Java, член, помеченный protected, доступен не только подклассам, определившим его, но и другим классам в том же пакете.

package p{
class Super{
    protected def f() { println("f") }
    }
        class Sub extends Super{
            f()
        }
        class Other{
                (new Super).f() // ошибка
        }
}

В примере, у класса Sub нет проблем с доступом к f, потому что f в Super был объявлен как protected, а Sub является подклассом Super. Напротив, доступ Other к f не разрешен, потому что Other не наследуется от Super. Последнее также признается в Java, потому что Other и Sub находятся в одном пакете.

Публичные (Public) члены

В Scala, если не указан ни один модификатор доступа, то по умолчанию он public. Этот член может быть доступен везде.

class Outer {
   class Inner {
      def f() { println("f") }
      class InnerMost {
         f() // правильно
      }
   }
   (new Inner).f() // правильно, потому что f() public
}

Защита области видимости

В Scala доступ к модификаторам доступа можно подчеркивать с помощью限定词. Формат:

private[x] 
или 
protected[x]

Здесь x указывает на пакет, класс или单体对象. Если写成 private[x], это читается как "Этот член виден только для класса [...] или для класса в [...] пакете и их сопутствующих объектов, а для всех остальных классов он private.

Эта техника очень полезна в больших проектах, которые разрабатываются через несколько пакетов, она позволяет определить某些 элементы, которые видны в некоторых подпакетах вашего проекта, но всегда недоступны для клиентов за пределами проекта.

package bobsrockets{
    package navigation{
        private[bobsrockets] class Navigator{
         protected[navigation] def useStarChart(){}
         class LegOfJourney{
             private[Navigator] val distance = 100
             }
            private[this] var speed = 200
            }
        }
        package launch{
        import navigation._
        object Vehicle{
        private[launch] val guide = new Navigator
        }
    }
}

В предыдущем примере класс Navigator помечен как private[bobsrockets], что означает, что этот класс видим для всех классов и объектов, включенных в пакет bobsrockets.

Например, доступ к Navigator из объекта Vehicle разрешен, потому что объект Vehicle включен в пакет launch, а пакет launch включен в bobsrockets, в то время как все коды за пределами пакета bobsrockets не могут получить доступ к классу Navigator.