12.1. Definiowanie pakietów

Kod programów pisanych w Scali może być grupowany w pakietach. Na początku pliku źródłowego można umieścić klauzulę pakietu w postaci słowa kluczowego package, po którym umieszczona jest nazwa pakietu. Kod z pliku Packages1.scala definiuje obiekt A w pakiecie a.

Plik Packages1.scala:
package a
object A

Pełną nazwą tego obiektu jest a.A.

scala> a.A
res0: a.A.type = a.A$@199c6b5

W jednym pliku można umieścić więcej klauzul pakietu. W pliku Packages2.scala znajdują się dwie takie klauzule.

Plik Packages2.scala:
package b1
package b2
object B1
class B2

W tym pliku zdefiniowane są obiekt b1.b2.B1 oraz klasa b1.b2.B2.

scala> b1.b2.B1
res1: b1.b2.B1.type = b1.b2.B1$@1bb571c

scala> new b1.b2.B2
res2: b1.b2.B2 = b1.b2.B2@1d2ade3

Klauzule pakietu powinny znajdować się na początku pliku. Klauzula package c2, z wiersza , z pliku Packages3.scala, znajduje się po definicji obiektu C1 z wiersza , co jest nieprawidłowe.

Plik Packages3.scala:
package c1
object C1 
package c2 
class C2

Kod z pliku Packages3.scala nie kompiluje się.

$ scalac Packages3.scala
Packages3.scala:4: error: '{' expected but ';' found.
class C2
^
one error found

Klauzula pakietu może zawierać nazwę złożoną z dwóch lub więcej nazw pakietów połączonych kropkami.

Plik Packages4.scala:
package d1
package d2.d3
object D1
class D2

W pliku Packages4.scala są zdefiniowane obiekt d1.d2.d3.D1 oraz klasa d1.d2.d3.D2.

scala> d1.d2.d3.D1
res0: d1.d2.d3.D1.type = d1.d2.d3.D1$@1fb0bed

scala> new d1.d2.d3.D2
res1: d1.d2.d3.D2 = d1.d2.d3.D2@225dd7

Oprócz klauzuli pakietu można stosować instrukcje pakietu, określające zasięg swojego działania za pomocą nawiasów klamrowych. Instrukcje pakietu mogą być stosowane nie tylko na początku pliku.

Plik Packages5.scala:
package e1
object E1
package e2 {
  object E2
}
package e3.e4 {
  class E3
}

W pliku Packages5.scala zdefiniowano obiekty e1.E1 i e1.e2.E2 oraz klasę e1.e3.e4.E3.

scala> e1.E1
res2: e1.E1.type = e1.E1$@17a8434

scala> e1.e2.E2
res3: e1.e2.E2.type = e1.e2.E2$@1278d2b

scala> new e1.e3.e4.E3
res4: e1.e3.e4.E3 = e1.e3.e4.E3@157bcad

Instrukcje pakietu można zagnieżdżać.

Plik Packages6.scala:
package f1 {
  object F1
  package f2.f3 {
    object F2
  }
  package f2.f3 {
    class F3
  }
  package f4 {
    class F4
  }
}

Plik Packages6.scala definiuje obiekty: f1.F1 i f1.f2.f3.F2 oraz klasy: f1.f2.f3.F3 i f1.f4.F4.

scala> f1.F1
res5: f1.F1.type = f1.F1$@14711e2

scala> f1.f2.f3.F2
res6: f1.f2.f3.F2.type = f1.f2.f3.F2$@bada5a

scala> new f1.f2.f3.F3
res7: f1.f2.f3.F3 = f1.f2.f3.F3@18be6e8

scala> new f1.f4.F4
res8: f1.f4.F4 = f1.f4.F4@13194df

Specyfikacja języka Scala opisuje klauzule i instrukcje pakietu punktach 9.1 i 9.2.

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.