在Scala中没有静态方法和静态字段,但是可以使用object这个语法结构来达到同样的目的
1.scala类似于Java中的工具类,可以用来存放工具函数和常量
2.高效共享单个不可变的实例
3.单例模式
单例对象虽然类似于Java中的工具类,但它不是,还是一个对象,可以把单例对象名看做一个贴在对象上的标签。
package
logging
//
使用关键字
object
定义单例对象
object
Logger {
def
info
(message: String): Unit =
println
(s
"INFO: $message"
)
}
单例对象的使用
//
导入单例对象信息,使之在当前类可见
import
logging.
Logger
.
info
class
Project
(name: String, daysToComplete: Int)
class
Test {
val
project1 =
new
Project
(
"TPS Reports"
,
1
)
val
project2 =
new
Project
(
"Website redesign"
,
5
)
//
调用单例对象中定义的方法
info
(
"Created projects"
)
// Prints "INFO: Created projects"
}
类和单例对象的区别是,单例对象不能带参数,单例对象不能用new关键字实例化,所以没有机会传递给它实例化的参数。
单例对象在第一次访问的时候才会初始化。
当单例对象与某个类同名时,它被称为类的伴生对象,类和伴生对象必须定义在一个源文件里,类称为该单例对象的伴生类,类和他的伴生对象可以互相访问其私有成员。
不与伴生类共享名称的单例对象被称为独立对象,可以作为相关功能的工具类,或者scala应用程序的入口点。
在Scala的类中,与类名相同并且用object修饰的对象叫做伴生对象,类和伴生对象之间可以相互访问私有的方法和属性,他们必须存在同一个源文件中
class
AccountInfo {
//
类的伴生对象的功能特性并不在类的作用域
//
所以不能直接用
newUniqueNumber()
调用伴生对象的方法
var
id = AccountInfo.
newUniqueNumber
()
}
object
AccountInfo {
private
var
lastNumber =
0
private
def
newUniqueNumber
() = {
lastNumber +=
1
; lastNumber
}
def
main
(args: Array[String]) {
//
相当于
Java
中的静态方法调用
println
(AccountInfo.
newUniqueNumber
())
}
}
通常我们会在类的伴生对象中定义apply方法,当遇到类名(参数1,...参数n)时apply方法会被调用
class
AccountInfo {
}
object
AccountInfo {
private
var
lastNumber =
0
private
def
apply
(arg :Int) = {
lastNumber = arg*
2
+
1
; lastNumber
}
def
main
(args: Array[String]) {
println
(
AccountInfo
(
1
))
}
}
Scala程序都必须从一个对象的main方法开始,可以通过扩展App特质,不写main方法。
object
Hello
extends
App{
println
(
"Hello World"
)
}
同
object
Hello {
def
main
(args: Array[String]): Unit = {
println
(
"Hello World"
)
}
}
带有unapply方法的对象,经常用在模式匹配或者偏函数中。
import
scala.
util
.
Random
object
CustomerID {
def
apply
(name: String) = s
"$name--${Random.nextLong}"
def
unapply
(customerID: String): Option[String] = {
val
name = customerID.
split
(
"--"
).
head
if
(name.
nonEmpty
) Some(name)
else
None
}
}
//
调用
apply
方法创建一个对象,等价于
CustomerID.apply("Sukyoung")
val
customer1ID =
CustomerID
(
"Sukyoung"
)
// Sukyoung--23098234908
customer1ID
match
{
//
调用
unapply
方法,提取
name
信息
case
CustomerID
(name) =>
println
(name)
// prints Sukyoung
case
_ =>
println
(
"Could not extract a CustomerID"
)
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69947096/viewspace-2659537/ ,如需转载,请注明出处,否则将追究法律责任。