{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "

Previous

\n", "

Tour of Scala

\n", "
\n", "\n", "# Package Objects\n", "\n", "# Package objects\n", "\n", "Scala provides package objects as a convenient container shared across an entire package.\n", "\n", "Package objects\n", "can contain arbitrary definitions, not just variable and method definitions. For instance, they are frequently\n", "used to hold package-wide type aliases and implicit conversions. Package objects can even inherit\n", "Scala classes and traits.\n", "\n", "By convention, the source code for a package object is usually put in a source file named `package.scala`.\n", "\n", "Each package is allowed to have one package object. Any definitions placed in a package object are considered\n", "members of the package itself.\n", "\n", "See example below. Assume first a class `Fruit` and three `Fruit` objects in a package\n", "`gardening.fruits`:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "// in file gardening/fruits/Fruit.scala\n", "package gardening.fruits\n", "\n", "case class Fruit(name: String, color: String)\n", "object Apple extends Fruit(\"Apple\", \"green\")\n", "object Plum extends Fruit(\"Plum\", \"blue\")\n", "object Banana extends Fruit(\"Banana\", \"yellow\")\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now assume you want to place a variable `planted` and a method `showFruit` directly into package `gardening`.\n", "Here's how this is done:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "// in file gardening/fruits/package.scala\n", "package gardening\n", "package object fruits {\n", " val planted = List(Apple, Plum, Banana)\n", " def showFruit(fruit: Fruit): Unit = {\n", " println(s\"${fruit.name}s are ${fruit.color}\")\n", " }\n", "}\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As an example of how the use site looks, the following object `PrintPlanted` imports `planted` and `showFruit` in exactly the same\n", "way it imports class `Fruit`, using a wildcard import on package gardening.fruits:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "// in file PrintPlanted.scala\n", "import gardening.fruits._\n", "object PrintPlanted {\n", " def main(args: Array[String]): Unit = {\n", " for (fruit <- fruits.planted) {\n", " showFruit(fruit)\n", " }\n", " }\n", "}\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Package objects are like other objects, which means you can use inheritance for building them. For example, one might mix in a couple of traits:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "package object fruits extends FruitAliases with FruitHelpers {\n", " // helpers and variables follows here\n", "}\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that method overloading doesn't work in package objects.\n", "

Previous

\n", "

Tour of Scala

\n", "
" ] } ], "metadata": { "kernelspec": { "display_name": "Scala (2.13)", "language": "scala", "name": "scala213" }, "language_info": { "codemirror_mode": "text/x-scala", "file_extension": ".scala", "mimetype": "text/x-scala", "name": "scala", "nbconvert_exporter": "script", "version": "2.13.1" } }, "nbformat": 4, "nbformat_minor": 4 }