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.

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.