Scala权限
前提
理解权限的关键在于理解package的定义.
理解package
在Scala中,package必须定义在最上面的一行,用来说明该文件中的内容属于那个包,如果没有显示说明,则属于编译放置后的一级目录下. 按照以往开发的规则,包的名字代表了目录的层级的关系. 但是会有意外的情况,把某些不属于该目录层级关系下的文件放入,但是最后编译的时候会按照package为准,而不是放置源文件的目录层级关系.
理解Class
Class要具体位于某个package中,有两种表达方式. 第一种是将package定义在文件第一行,标明该文件的所有内容都属于该package. 第二种是限定package{} ,在{}里面定义的所有东西都属于该package.
两种方式可以一起使用
package test1 // ⚠️ test2 包在test1包下. package test2 { }
object-private权限
Scala中object-private权限是private[this],表示只允许在该实例内部使用,不允许其他任何对象访问.
class ClassOne {
private[this] def say(): Unit = {
}
def say(co : ClassOne) = {
// 编译不通过,因为say方法,只允许在该实例内部自己访问,而不允许其他对象访问.
co.say()
}
}
private权限
Scala中private权限是最小的权限,指定该权限的成员,只允许该类和伴生对象访问.
class ClassOne {
private def sayHello() : Unit = {
println("Hello")
}
def sayWorld() : Unit = {
// 可以编译,并且正常访问
sayHello()
println("World")
}
}
class ClassTwo {
// 编译不通过,不能访问sayHelo方法.
def run(cl : ClassOne) : Unit = {
cl.sayHello()
}
}
protected权限
Scala中protected权限,包含private权限外,还允许继承的类访问受保护的成员. 在Java中,还额外允许同一包中的其他类访问.
class ClassOne {
protected def sayHello() : Unit = {
println("Hello")
}
}
class ClassTwo extends ClassOne {
def run(cl : ClassOne): Unit = {
// 编译通过,因为ClassTwo继承了ClassOne,有权限访问ClassOne
cl.sayHello()
}
}
class ClassThree {
def run(cl : ClassOne) : Unit = {
// 编译不通过
cl.sayHello()
}
}
public权限
Scala中public权限,可以让任何地方的成员和类访问.
作用域保护
语法: private[X]或protected[X], X可以是包,类或者单例对象. 作用域保护是对指定范围内可见,而对其他范围是private或protected. 而不是对指定范围的权限是private或protected.
指定包的范围时,包只能是对其现在可见的. 如果指定非可见包,则会出现错误.
package com.basic {
object test {
def main(args: Array[String]): Unit = {
val ot = new ObjectTest()
ot.sayHello()
}
}
}
package com.user {
class ObjectTest {
// 不允许指定为basic,因为basic在此不可见.
private[basic] def sayHello() : Unit = {
println("Hello")
}
}
}