1.シングルトンオブジェクト
scalaには静的メソッドや静的フィールドはありませんが、オブジェクトの構文構造を使用して同じ目的を達成できます。オブジェクトは、クラスの単一のインスタンスを定義し、必要な特性を含みます。など:
object Accounts {
private var lastNumber = 0
def newUniqueNumber() = { lastNumber += 1;lastNumber}
}
新しいアカウントが必要な場合は、Account.newUniqueNumber()を呼び出します。
オブジェクトのコンストラクタは、オブジェクトが最初に使用されるときに呼び出されます。上記の例では、Account.newUniqueNumber()が最初に呼び出されたときにAccountのコンストラクタが実行されます。オブジェクトが使用されない場合、コンストラクタは実行します。
オブジェクトは基本的にクラスのすべての特性を持つことができ、他のクラスまたは特性を拡張することもできますが、唯一の違いはコンストラクターパラメーターを提供できないことです。
Javaでシングルトンオブジェクトを使用するシナリオでは、すべてのオブジェクトをscalaで使用でき
ます。1.ツール関数または定数を格納する場所として
2.単一の不変インスタンスを効率的に共有する
3.調整する必要がある提供するとき
2.関連オブジェクト
Javaでは通常、インスタンスメソッドと静的メソッドの両方を持つクラスを使用します。scalaでは、同じ名前のクラスとコンパニオンオブジェクトを使用して同じ目的を達成できます。など:
class Account {
val id = Account.newUniqueNumber()
private var balance = 0.0
def deposit(amount: Double) {balance += amount}
...
}
object Account { //伴生对象
private var lastNumber = 0
private def newUniqueNumber() = {
lastNumer += 1
lastNumber
}
}
クラスとそのコンパニオンオブジェクトはプライベートプロパティにアクセスできますが、ソースファイルに存在する必要があります。
3. applyメソッド
次の式に遭遇すると、applyメソッドが呼び出されます。
オブジェクト(パラメーター1、パラメーター2、...、パラメーターN)
通常、このようなapplyメソッドは、コンパニオンクラスのオブジェクトを返します。
例:
Arrayオブジェクトは、次の式を使用して配列を作成できるように、applyメソッドを定義します:
Array( "Mary"、 "Jack"、 "Rose"、 "Jkson")
コンストラクタを使用しないのはなぜですか?入れ子の場合、次のようにnewを省略した方が便利です
。Arrray(配列(1,7)、配列(2,9))
配列(100)と新しい配列(100)は簡単に取得できることに注意してください。混合すると、最初の要素はapply(100)で、単一の要素100 Array [Int]を出力し、2番目の式はコンストラクタをthis(100)と呼び、結果はArray [Nothing]となり、これは100個のnull要素を含みます。
例:
class Account private (val id: Int,initialBalance: Double) {
private var balance = initialBalance
...
}
object Account { //伴生对象
def apply(initialBalance: Double) = new Account(newUniqueNumber(),initialBalance)
...
}
このようにして、次のようにアカウントオブジェクトを構築できます。
val acct = Account(1,1000.0)
4.アプリケーションオブジェクト
各scalaプログラムは、オブジェクトのメインメソッドから開始する必要があります。このメソッドタイプはArray [String] =>ユニットです。
object Hello {
def main(args: Array[String]){
println("Hello Scala")
}
}
mainメソッドを自分で提供することに加えて、Appトレイトを拡張してmainメソッドをコンストラクタメソッドに配置することもできます。
object Hello extends App {
println("Hello Scala")
}
コマンドラインパラメータが必要な場合は、args属性を使用して取得できます。
object Hello extends App {
if (args.length > 0)
println(args(0))
else
println("Hello Scala")
}
5.列挙
scalaには列挙型はありません。ただし、標準クラスライブラリには、列挙を生成するために使用できる列挙ヘルパークラスが用意されています。
Enumerationクラスを継承するオブジェクトを定義し、Valueメソッドを呼び出して、列挙内のすべてのオプション値を初期化します。など:
object TrafficLightColor extends Enumeration {
val Red, Yellow, Green = Value
}
ここでは、Red、Yellow、Greenの3つのフィールドを定義し、Value呼び出しでそれらを初期化します。
val Red = Value
val Yellow = Value
val Green = Value
Valueメソッドを呼び出すたびに、Valueとも呼ばれる内部クラスの新しいインスタンスが返されます。または
、IDと名前をValueメソッドに渡すことができます。
val Red = Value(0,"Stop")
val Yellow = Value(11) //名称为“Yellow”
val Green = Value("") //id为12
指定されていない場合、idは0から始まり、前の列挙値に1を追加します。デフォルト名はフィールド名です。
定義が完了した後、より簡単にしたい場合は、TrafficLightColor.Redを使用して列挙値を参照できます。
import TrafficLightColor._
列挙値を直接紹介します。
列挙型はTrafficLightColorではなくTrafficLightColor.Valueであることに注意してください。これはこれらの値を保持するオブジェクトです。誰か
が型エイリアスを追加することを提案しました:
object TrafficLightColor extends Enumeration {
type TrafficLightColor = Value
val Red, Yellow, Green = Value
}
列挙型はTrafficLightColor.TrafficLightColorになりましたが、それを行うにはimportステートメントを使用する場合にのみ意味があり
ます。
import TrafficLightClor._
def doWhar(color: TrafficLight) = {
if (color == Red) "Stop"
else if (color == Yellow) "hurry up"
else "go"
}
列挙値のIDはidメソッドによって返され、名前はtoStringメソッドによって返されます。
TrafficLightColor.valuesの呼び出しは、すべての列挙値のコレクションを出力します。
for (x <- TrafficLightColor.values) println(x.id + ":" + x.toString)
最後に、列挙されたIDまたは名前で検索して見つけることができます次の2つの文は、TrafficLightColor.Redオブジェクトとして出力されます。
TrafficLightColor(0) //将调用Enumration.apply方法
TrafficLightColor.withName("Red")