8.1. Definiowanie obiektów
Scala umożliwia tworzenie tak zwanych obiektów, które są pojedynczymi egzemplarzami klas, tworzonymi przy pomocy słowa kluczowego object. Definicja obiektu przypomina definicję bezparametrowej klasy, w której słowo kluczowe class zastąpione jest słowem kluczowym object. W pliku Objects1.scala znajduje się definicja obiektu o nazwie Hello.
Plik Objects1.scala: object Hello { def speak = println("hello") }
Oto wywołanie jego metody speak.
scala> Hello.speak hello
Nie ma potrzeby (ani możliwości) tworzenia instancji obiektu za pomocą new — tak jak jest to w przypadku klas. Hello jest nazwą obiektu, a nie klasy.
scala> new Hello
<console>:11: error: Hello does not have a constructor
new Hello
^
Definicja obiektu nie powoduje utworzenia samej instancji tego obiektu. Instancja obiektu jest tworzona w sposób leniwy, przy pierwszym odwołaniu do niej.
Plik Objects2.scala: object Hello2 { println("initializing Hello") def speak = println("hello") }
Poniższe polecenia powodują dwukrotne wywołanie metody speak obiektu Hello2, zdefiniowanego w pliku Objects2.scala.
scala> Hello2.speak initializing Hello hello
scala> Hello2.speak hello
Instrukcja println, znajdująca się w ciele definicji obiektu Hello2, została wykonana przy pierwszym odwołaniu do obiektu, kiedy tworzona była instancja obiektu. Drugie odwołanie nie powoduje już ponownego wykonania tej instrukcji.
Wewnątrz definicji obiektu można definiować różne składowe, w tym inne obiekty lub klasy. W pliku Objects3.scala znajduje się przykład takiego obiektu, który zawiera różnego rodzaju definicje.
Plik Objects3.scala: object Container { def hello = println("hello") val hi: T = "Hi" var x: T = "?" type T = String object Welcome { def welcome = "Welcome" + x } class Greeting(name: String) { def greet = println("Hello "+name) } }
Poniżej znajdują się wyrażenia ilustrujące możliwe sposoby użycia tego obiektu.
scala> Container.hello
hello
scala> Container.hi
res5: Container.T = Hi
scala> Container.x = "!"
Container.x: Container.T = !
scala> Container.Welcome.welcome
res6: String = Welcome!
scala> val g = new Container.Greeting("Peter")
g: Container.Greeting = Container$Greeting@b7395e
scala> g.greet
Hello Peter
![]() | Specyfikacja języka Scala opisuje obiekty w punkcie 5.5. |
Plik Objects1.scala:
object Hello {
def speak = println("hello")
}

