1. 概要

このチュートリアルでは、Scalaでのオブジェクトのパッケージ化、インポート、およびパッケージ化の概念について説明します。

タイプ、パッケージの概念、およびいくつかの強力なパッケージ機能をインポートするさまざまな方法を見ていきます。

2. Scalaでのインポート

2.1. 基本的なインポート

単一のクラスのインポートは非常に簡単で、Javaなどの他のオブジェクト指向言語に似ています。

import com.baeldung.scala.packageimport.vehicle.Bicycle

パッケージ内のすべてのクラスをインポートする場合は、「_」表記を使用できます。

import com.baeldung.scala.packageimport.vehicle._

インポートするクラスを1行で指定することもできます。

import com.baeldung.scala.packageimport.vehicle.{Bicycle, Car, Vehicle}

2.2. インポートのエイリアシング

同じ名前のモジュールを異なるパッケージからインポートしなければならない場合があります。

import java.util.Date
import java.sql.Date

この場合、異なる日付形式を返す異なる日付クラスがあります。 java.sql.Dateは時刻情報なしで日付を表示します一方、java.util.Dateは日付と時刻情報を表示します

名前空間の衝突や混乱を避けるために、インポートステートメントでクラスのエイリアシングを設定する必要があります

import java.util.{Date => utilDate}
import java.sql.{Date => sqlDate}

これで、エイリアスを他のオブジェクト名と同じように使用できます。

def run(): Unit = {
  val dt: utilDate = new utilDate()
  val dtSql: sqlDate = new sqlDate(System.currentTimeMillis())
  println(s"I am a vehicle running on $dt !")
  println(s"I am a vehicle running on $dtSql !")
}

クラスが出力できるものの例を見てみましょう。

I am a vehicle running on Wed May 27 13:50:53 CEST 2020 !
I am a vehicle running on 2020-05-27 !

2.3. インポート中にクラスを非表示にする

java.sql.date 形式のみを使用したいが、 java.util からすべてのモジュールをインポートする必要がある場合、javaを非表示にする必要があります。 util.date:

import java.util.{Date => _, _}
import java.sql.Date

これで、衝突を気にせずにdateオブジェクトを作成できます。

override def run(): Unit = {
  super.run()
  val dtSql: Date = new Date(System.currentTimeMillis())
  println(s"$numberOfTires tires from the bicycle brand $brand are running on $dtSql")
}

3. Scalaでのパッケージ化

Scalaパッケージの作成は、Javaで私たちが知っている方法と似ています。 クラスの先頭でパッケージ名を宣言する必要があります。

package com.baeldung.scala

package object packageimport {
  trait Motor {
    val dieselMessage: String = "I am not environment friendly"
    val noDieselMessage: String = "I am environment friendly"
  }
}

さらに、中括弧を使用して、1つのファイルに複数のパッケージを配置する可能性があります。 この場合、異なるパッケージに同じ名前の2つのクラスを含めることができます:

package com.baeldung.scala.packageimport.vehicle {
  import java.util.{Date => utilDate}
  import java.sql.{Date => sqlDate}

  abstract class Vehicle(numberOfTires: Int, brand: String) {

    def run(): Unit = {
      val dt: utilDate = new utilDate()
      val dtSql: sqlDate = new sqlDate(System.currentTimeMillis())
      println(s"I am a vehicle running on $dt !")
      println(s"I am a vehicle running on $dtSql !")
    }
  }
}

package com.baeldung.scala.packageimport.vehicleNew {
  import java.sql.{Date => sqlDate}

  abstract class Vehicle(numberOfTires: Int, brand: String) {

    def run(): Unit = {
      val dtSql: sqlDate = new sqlDate(System.currentTimeMillis())
      println(s"I am a NEW vehicle running on $dtSql !")
    }
  }
}

このアプローチを使用すると、com.baeldung.scala.packageimport.vehicleNew.Vehicleまたはcom.baeldung.scala.packageimport.vehicle.Vehicleのいずれかを使用できます。

次に、2番目のクラスにアクセスしてみましょう。

class Car(numberOfTires: Int, brand: String, isDiesel: Boolean) extends Vehicle(numberOfTires, brand) with Motor {
  override def run(): Unit = {
    super.run()
    println(s"$numberOfTires tires from the brand $brand are running. It is a diesel motor: $isDiesel.")
    if (isDiesel)
      println(dieselMessage)
  }
}

4. パッケージオブジェクト

パッケージオブジェクトを使用すると、メソッド、関数、および変数をパッケージと直接整列させることができます。 その結果、このパッケージのすべての子メンバーがそれらにアクセスできるようになります。

パッケージごとに、パッケージのソースコードをに配置するパッケージオブジェクトを1つだけ作成できます。 Scalaの規則によれば、常にpackage.scalaと呼ぶ必要があります。

package com.baeldung.scala

package object packageimport {
  val year = "2020"
  
  trait Motor {
    val dieselMessage: String = "I am not environment friendly"
    val noDieselMessage: String = "I am environment friendly"
  }

}

のすべてのメンバー com.baeldung.scala.package アクセスできるようになりますモーター。 加えて、 これらのメンバーのいずれかにパッケージオブジェクトをインポートする必要はありません

object bmwB38 extends Motor {
 
  def run(): Unit =
    println(s"I am a bmwB38 ! $noDieselMessage")
}

5. 結論

このチュートリアルでは、インポートの使用方法、他のコンポーネントのパッケージ化方法、およびパッケージオブジェクトの使用方法について説明しました。

パッケージをインポートするさまざまな方法、インポートからクラスを非表示にする方法、および同じ名前のクラスのインポートを処理する方法を検討しました。 さらに、パッケージングへのさまざまなアプローチを検討しました。

最後に、パッケージオブジェクトの強力な機能について説明しました。これは、メソッド、変数、およびその他のコンポーネントをトップレベルでカプセル化するのに役立ちます。

いつものように、コードはGitHubにあります。