Ответ 1
Вы можете указать имя пакета для private
модификатора, чтобы разрешить доступ к этому классу только из указанного пакета. По умолчанию (без указанного пакета) он отображается только для других участников входящего пакета.
$ cat > test.scala <<EOF
package myPackage {
private[myPackage] class Test
private object A extends Test
}
package otherPackage {
object B extends myPackage.Test
}
EOF
$ scalac test.scala
test.scala:7: error: class Test in package myPackage cannot be accessed in package myPackage
object B extends myPackage.Test
^
one error found
Например, вы можете получить доступ к private
классу из своего сопутствующего объекта, например:
trait ITest
private class Test extends ITest
object Test {
def apply(): ITest = new Test
}
Test()
// ITest = [email protected]
Дальнейшие разъяснения по примерам:
package myPackage {
private class Test
private object A extends Test
object B extends myPackage.Test //Compile error: private class Test escapes its defining scope as part of type myPackage.Test
private object C extends myPackage.Test // works since C is also private
object Test {
def apply() = new Test //error: private class Test escapes its defining scope as part of type myPackage.Test
}
object Test2 {
def apply(): ITest = new Test //works as ITest is public
}
}
Пока экземпляры частного класса не выходят из области охватываемого пакета, его можно использовать в иерархии пакетов. Объекты Companion, получающие доступ к частным классам, должны быть в одной иерархии пакетов. С private[P]
- p
может быть любое имя пакета, которое существует.