Scala class和case class的區別
阿新 • • 發佈:2018-03-22
arr 實現 array data https arch ctu alt 序列
6、case class構造函數的參數是public級別的,我們可以直接訪問;
在Scala中存在case class,它其實就是一個普通的class。但是它又和普通的class略有區別,如下:
1、初始化的時候可以不用new,當然你也可以加上,普通類一定需要加new;
scala>
case
class
Iteblog(name
:
String)
defined
class
Iteblog
scala>
val
iteblog
=
Iteblog(
"iteblog_hadoop"
)
iteblog
:
Iteblog
=
Iteblog(iteblog
_
hadoop)
scala>
val
iteblog
=
new
Iteblog(
"iteblog_hadoop"
)
iteblog
:
Iteblog
=
Iteblog(iteblog
_
hadoop)
2、toString的實現更漂亮;
scala> iteblog
res
5
:
Iteblog
=
Iteblog(iteblog
_
hadoop)
3、默認實現了equals 和hashCode;
scala>
val
iteblog
2
=
Iteblog(
"iteblog_hadoop"
)
iteblog
2
:
Iteblog
=
Iteblog(iteblog
_
hadoop)
scala> iteblog
==
iteblog
2
res
6
:
Boolean
=
true
scala> iteblog.hashCode
res
7
:
Int
=
57880342
4、默認是可以序列化的,也就是實現了Serializable ;
scala>
class
A
defined
class
A
scala>
import
java.io.
_
import
java.io.
_
scala>
val
bos
=
new
ByteArrayOutputStream
bos
:
java.io.ByteArrayOutputStream
=
scala>
val
oos
=
new
ObjectOutputStream(bos)
oos
:
java.io.ObjectOutputStream
=
java.io.ObjectOutputStream
@
4
c
257
aef
scala> oos.writeObject(iteblog)
scala>
val
a
=
new
A
a
:
A
=
$iwC$$iwC$A
@
71687
b
10
scala> oos.writeObject(a)
java.io.NotSerializableException
:
$iwC$$iwC$A
5、自動從scala.Product中繼承一些函數;6、case class構造函數的參數是public級別的,我們可以直接訪問;
scala> iteblog.name
res
11
:
String
=
iteblog
_
hadoop
7、支持模式匹配;
其實感覺case class最重要的特性應該就是支持模式匹配。這也是我們定義case class的唯一理由,難怪Scala官方也說:It makes only sense to define case classes if pattern matching is used to decompose data structures. 。來看下面的例子:
object
TermTest
extends
scala.App {
def
printTerm(term
:
Term) {
term
match
{
case
Var(n)
=
>
print(n)
case
Fun(x, b)
=
>
print(
"^"
+ x +
"."
)
printTerm(b)
case
App(f, v)
=
>
print(
"("
)
printTerm(f)
print(
" "
)
printTerm(v)
print(
")"
)
}
}
def
isIdentityFun(term
:
Term)
:
Boolean
=
term
match
{
case
Fun(x, Var(y))
if
x
==
y
=
>
true
case
_
=
>
false
}
val
id
=
Fun(
"x"
, Var(
"x"
))
val
t
=
Fun(
"x"
, Fun(
"y"
, App(Var(
"x"
), Var(
"y"
))))
printTerm(t)
println
println(isIdentityFun(id))
println(isIdentityFun(t))
}
Scala class和case class的區別