12.2. Obiekt pakietowy

Scala umożliwia definiowanie tak zwanego obiektu pakietowego. Definicja takiego obiektu wygląda jak definicja zwykłego obiektu o nazwie takiej, jak nazwa pakietu, ale poprzedzona jest słowem kluczowym package. Składowe takiego obiektu zostają dodane do pakietu. W pliku PackageObject1.scala znajduje się definicja obiektu Hi oraz metody talk, znajdujących się w pakiecie greetings1.hello. Definicja metody talk znajduje się wewnątrz definicji obiektu pakietowego hello.

Plik PackageObject1.scala:
package greetings1 {
  package hello {
    object Hi {
      def speak = println("Hi!")
    }
  }
  package object hello {
    def talk = println("Hello!!")
  }
}

Metoda talk jest składnikiem pakietu greetings1.hello.

scala> greetings1.hello.talk
Hello!!

scala> greetings1.hello.Hi.speak
Hi!

Obiekt pakietowy hello jest zdefiniowany w zasięgu instrukcji package greetings1, ale poza zasięgiem instrukcji package hello. Gdyby był zdefiniowany wewnątrz tej instrukcji, resultat byłby inny. W pliku PackageObject2.scala obiekt pakietowy jest zdefiniowany w zasięgu instrukcji package hello.

Plik PackageObject2.scala:
package greetings2 {
  package hello {
    object Hi {
      def speak = println("Hi!")
    }
    package object hello {
      def talk = println("Hello!!")
    }
  }
}

Powyższa definicja skutkuje utworzeniem dodatkowego pakietu o nazwie hello, wewnątrz pakietu greetings2.hello. Metoda talk zostaje zatem umieszczona nie w pakiecie greetings2.hello, ale w pakiecie greetings2.hello.hello.

scala> greetings2.hello.talk
<console>:11: error: object talk is not a member of package greetings2.hello
       greetings2.hello.talk
                        ^

scala> greetings2.hello.Hi.speak
Hi!

scala> greetings2.hello.hello.talk
Hello!!

Specyfikacja języka Scala opisuje obiekty pakietowe w punkcie 9.3.

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.