Руководство по Scala. Модификаторы доступа.

В данной статье мы рассмотрим модификаторы доступа в языке программирования Scala. Модификаторы доступа это некоторые ключевые слова, которые указывают, кто и как может получить доступ к классу, методу или полю.

В Scala классы и объекты могут иметь следующие модификаторы доступа:

  • private
  • protected
  • public – Присваивается по умолчанию (если не указывается явно)

Для того, чтобы присвоить модификатор доступа, необходимо использовать одно из данных ключевых слов.

Разберем каждый из данных модификаторов более подробно.


Public

Данный модификатор является базовым (т.е. присваивается по умолчанию). Сущности, с данным модификатором доступа могут быть доступны из любой части программы.

Рассмотрим простой пример:


package net.proselyte.scalatutorial.access_modifiers

/**
  * Simple Scala class that demonstrates access modifier public.
  *
  * @author Eugene Suleimanov
  */

class PublicDemo {

  class Developer {
    def writeCode(): Unit = {
      println("Developer writes code...")
    }

    class InnerDeveloperClass {
      writeCode();
    }

  }

  (new Developer).writeCode();    // Must work - method is public
}

В данном классе мы имеем доступ к методу writeCode из класса PublicDemo, и из класса InnerDeveloperClass, так как он является public методом.


Protected

Сущности, отмеченные модификатором доступа protected доступны внутри самого класса и из подклассов данной сущности.

Рассмотрим простой пример:


package net.proselyte.scalatutorial.access_modifiers

/**
  * Simple Scala package that demonstrates access modifier protected.
  * 
  * @author Eugene Suleimanov
  */

package ProtectedDemo{
  class Specialist{
    protected def makeJob(): Unit ={
      println("Specialist makes job...")
    }
  }
  
  class Developer extends Specialist{
    makeJob();
  }
  
  class Animal{
    (new Specialist).makeJob(); // We get error - method makeJob() is protected and can't be accessed.
  }
}

В данном примере класс Developer имеет доступ к методу makeJob(), так как он является подклассом класса Specialist, а класс Animal не имеет доступа к данному методу, так как он не является его наследником.


Private

Сущности, отмеченные модификатором private доступны только внутри самого класса.

Рассмотрим следующий пример:


package net.proselyte.scalatutorial.access_modifiers

/**
  * Simple Scala class that demonstrates access modifier private.
  */
class PrivateDemo {

  class Developer {
    private def sleep() {
      println("Developer sleeps at home...");
    }


    class InnerDeveloperClass{
      sleep(); 
    }
  }
  
  (new Developer).sleep(); // Error - private method of class Developer is not accessible outside the class.
}

В данном примере метод sleep() доступен только внутри самого класса Developer, но, не доступен из класса PrivateDemo, так как, он является приватным.


Область защиты

В языке Scala модификаторы доступа могут быть дополнены квалификаторами.

Для понимания того как это работает на практике, рассмотрим следующий пример:


package net.proselyte.scalatutorial.access_modifiers

/**
  * Simple Scala package tht demonstrates scope of protection.
  *
  * @author Eugene Suleimanov
  */
package project {
  package specialists {

    class Developer {
      private[specialists] var specialty = "Java Developer";
      private[project] var position = "Team Lead";
      private[this] var hobby = "Sport";

      def doJob(developer: Developer) {
        println(developer.specialty);
        println(developer.position);
        println(developer.hobby); // Error - not accessible
      }
    }
  }
}

В данном примере specialty доступна в пределах пакета specialist, position – в пределах пакета project, а hobby доступна только внутри самого класса Developer.

На этом мы заканчиваем изучение модификатором доступа в Scala.
В следующей статье мы рассмотрим оператор ветвления в данном языке программирования.