I'm just going over some Scala tutorials on the Internet and have noticed in some examples an object is declared at the start of the example.
What is the difference between class and object in Scala?
Answer
tl;dr
class Cdefines a class, just as in Java or C++.object Ocreates a singleton objectOas instance of some anonymous class; it can be used to hold static members that are not associated with instances of some class.object O extends Tmakes the objectOan instance oftrait T; you can then passOanywhere, aTis expected.- if there is a
class C, thenobject Cis the companion object of classC; note that the companion object is not automatically an instance ofC.
Also see Scala documentation for object and class.
Usage as host of static members
Most often, you need an object to hold methods and values/variables that shall be available without having to first instantiate an instance of some class.
This use is closely related to static members in Java.
object A {
def twice(i: Int): Int = 2*i
}
You can then call above method using A.twice(2).
If twice were a member of some class A, then you would need to make an instance first:
class A() {
def twice(i: Int): Int = 2 * i
}
val a = new A()
a.twice(2)
You can see how redundant this is, as twice does not require any instance-specific data.
Usage as a special named instance
You can also use the object itself as some special instance of a class or trait.
When you do this, your object needs to extend some trait in order to become an instance of a subclass of it.
Consider the following code:
object A extends B with C {
...
}
This declaration first declares an anonymous (inaccessible) class that extends both B and C, and instantiates a single instance of this class named A.
This means A can be passed to functions expecting objects of type B or C, or B with C.
Additional Features of object
There also exist some special features of objects in Scala.
I recommend to read the official documentation.
def apply(...)enables the usual method name-less syntax ofA(...)def unapply(...)allows to create custom pattern matching extractors- if accompanying a class of the same name, the object assumes a special role when resolving implicit parameters
No comments:
Post a Comment