软件包的主要目的是使文件模块化并易于维护。因此, 我们根据创建的名称空间将项目文件保存在几个不同的文件夹或目录中, 但有时我们希望某些变量, 定义, 类或对象可被整个包访问。但是无法将定义, 数据变量和类型别名直接保存在包中。为此, 我们具有包对象, 以便公共数据可以位于包的顶层。包对象在scala 2.8版中引入。
语法如下:
package projectx
package src
package main
object `package`
{
//using backticks
val x
//members
}
或标准方法是
package src
package object main
{
val x
//members
}
在上面的语法中, 包对象的所有成员对projectx.src.main包中的所有类均可用, 并且此文件将另存为package.scala在目录/包" main"中, 该目录/包也与包名称相对应。
例子:
让我们拥有一个包对象GFG, 其路径如下:
File Path: ../src/language/GFG/package.scala
package language
package object GFG
{
val fees = "fees"
val tax = "tax"
}
另一个文件GFG.scala及其主要方法。
File Path: ../src/language/GFG/GFG.scala
package language.GFG
object GFG
{
val scala = "scala"
val java = "java"
val csharp = "csharp"
}
object demo
{
def main( args : Array[String])
{
println(GFG.scala)
println(GFG.csharp)
var totalfees = tax + fees
println(totalfees)
}
}
说明:
正如我们所看到的, 因为GFG.scala和package.scala处于同一级别, 所以可以直接使用税费。
+src
+language
+GFG.scala
+package.scala
//Scala program of package object
//package eatables.food
//Object created
object GFG
{
val scala = "scala"
val java = "java"
val csharp = "csharp"
}
//Object created
object demo
{
//Driver code
def main( args : Array[String])
{
println(GFG.scala)
println(GFG.csharp)
var totalfees = tax + fees
println(totalfees)
}
}
//package object created
object ` package `
{
val fees = "fees"
val tax = "tax"
}
输出如下:
scala
csharp
taxfees
包装对象要点
- 它们可以扩展其他类别和/或混合特性。
package object main extends demovars { val x = a // from demovars val y = b // from demovars // members }
- 它们是存储隐式而不是在其中定义它们的好地方伴随对象.
- 使用包对象, 我们可以通过避免使用导入来缩短代码。
package object main { val x = demovars.a // from demovars val y = demovars.b // from demovars // members }
- 每个包只允许有一个带有相应目录目录/包名称的包对象。
+src +eatables +food.scala +package.scala // package object for eatables folder +drinkables +drinks.scala +package.scala // package object for drinkable folder