Scala-アクセス修飾子

この章では、Scalaアクセス修飾子について説明します。パッケージ、クラス、またはオブジェクトのメンバーには、privateおよびprotectedのアクセス修飾子でラベルを付けることができます。これら2つのキーワードのいずれも使用していない場合、アクセスはpublicと見なされます。これらの修飾子は、メンバーへのアクセスをコードの特定の領域に制限します。アクセス修飾子を使用するには、次のセクションで説明するように、パッケージ、クラス、またはオブジェクトのメンバーの定義にそのキーワードを含めます。

プライベートメンバー

プライベートメンバーは、メンバー定義を含むクラスまたはオブジェクト内でのみ表示されます。

以下は、プライベートメンバーを説明するためのサンプルコードスニペットです-

class Outer {
   class Inner {
      private def f() { println("f") }
      
      class InnerMost {
         f() // OK
      }
   }
   (new Inner).f() // Error: f is not accessible
}

Scalaでは、アクセス(新しい内部)。fはInnerでプライベートとして宣言されており、アクセスはクラスInner内からではないため、f()は不正です。対照的に、クラスInnermostのfへの最初のアクセスは、そのアクセスがクラスInnerの本体に含まれているため、OKです。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は「Super」クラスで保護されていると宣言されており、「Sub」クラスはSuperのサブクラスであるため、クラスSubのfへのアクセスはOKです。対照的に、クラス「Other」はクラス「Super」から継承しないため、「Other」クラスのfへのアクセスは許可されません。Javaでは、「Other」クラスが「Sub」クラスと同じパッケージに含まれているため、後者のアクセスは引き続き許可されます。

パブリックメンバー

プライベートおよび保護されたメンバーとは異なり、パブリックメンバーにパブリックキーワードを指定する必要はありません。パブリックメンバー用の明示的な修飾子はありません。このようなメンバーには、どこからでもアクセスできます。

以下は、パブリックメンバーを説明するためのサンプルコードスニペットです-

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は、同封のパッケージプロフェッショナル内のすべてのクラスからアクセスできます。

  • 可変の友達は、同封のパッケージ社会内のどのクラスにもアクセスできます。

  • 変数シークレットは、インスタンスメソッド(this)内の暗黙的なオブジェクトでのみアクセスできます。