scala - 同名 - シングルトンオブジェクト
Scalaのオブジェクトとクラスの違い (9)
私はちょうどインターネット上のいくつかのScalaチュートリアルを調べていますが、いくつかの例では、例の始めにオブジェクトが宣言されています。
Scalaのclass
とobject
違いは何ですか?
tl; dr
-
class C
はJavaやC ++と同様にクラスを定義します。 -
object O
は、いくつかの匿名クラスのインスタンスとしてsingletonobject O
作成します。 クラスのインスタンスに関連付けられていない静的メンバーを保持するために使用できます。 -
object O extends T
をオブジェクトobject O extends T
のインスタンスにobject O extends T
する。 あなたはどこにでもO
を渡すことができ、T
が期待されます。 -
class C
がある場合、object C
はクラスC
コンパニオンオブジェクトです。 コンパニオンオブジェクトは自動的にC
インスタンスではないことに注意してください。
Scalaのobjectとclassドキュメントも参照してください。
静的メンバーのホストとしての使用
ほとんどの場合、あるクラスのインスタンスを最初にインスタンス化しなくても利用可能なメソッドと値/変数を保持するobject
が必要です。 これは、Javaのstatic
メンバーと密接に関連しています。
object A {
def twice(i: Int): Int = 2*i
}
その後、 A.twice(2)
を使用して上記のメソッドを呼び出すことができます。
twice
クラスA
メンバーだった場合は、まずインスタンスを作成する必要があります。
class A() {
def twice(i: Int): Int = 2 * i
}
val a = new A()
a.twice(2)
twice
はインスタンス固有のデータを必要としないので、これがどのように冗長であるかを見ることができます。
特別な名前付きインスタンスとしての使用
object
自体をクラスや特性の特別なインスタンスとして使用することもできます。 これを行うと、オブジェクトはそのサブクラスのインスタンスになるために、いくつかのtrait
を拡張する必要があります。
次のコードを考えてみましょう:
object A extends B with C {
...
}
この宣言はまず、 B
とC
両方を拡張する匿名(アクセスできない)クラスを宣言し、 A
という名前のこのクラスのインスタンスをインスタンス化します。
これは、 A
がタイプB
またはC
オブジェクト、またはB with C
C
を持つ関数を渡すことができることを意味します。
object
追加機能
Scalaにはオブジェクトの特別な機能がいくつか存在します。 objectを読むことをお勧めしobject 。
-
def apply(...)
は、A(...)
の通常のメソッドの名前のない構文を有効にしますA(...)
-
def unapply(...)
はカスタムパターンマッチングextractorsを作成することを可能にする - 同じ名前のクラスを伴う場合、オブジェクトは暗黙的なパラメータを解決する際に特別な役割を担います
Scalaでオブジェクトを定義することは、静的メソッドのみを持つJavaクラスを定義することに似ています。 しかし、Scalaでは、オブジェクトは別のスーパークラスを拡張し、インタフェースを実装し、クラスのインスタンスであるかのように渡すことができます。 (それはクラスの静的メソッドに似ていますが、より良くなります)。
class
は定義、記述です。 それは、方法と他のタイプの構成に関してタイプを定義します。
object
はシングルトン(一意であることが保証されているクラスのインスタンス)です。 コード内のすべてのobject
に対して、匿名クラスが作成されます。このクラスは、実装するobject
を宣言したクラスから継承しobject
。 このクラスは、Scalaのソースコードからは見えませんが、リフレクションを通して得ることができます。
object
とclass
間には関係がありobject
。 同じ名前を共有するオブジェクトは、クラスのコンパニオンオブジェクトと呼ばれます。 これが起こると、それぞれは他の方法でprivate
可視性の方法にアクセスすることができます。 ただし、これらのメソッドは自動的にインポートされません。 それらを明示的にインポートするか、クラス/オブジェクト名の接頭辞を付ける必要があります。
例えば:
class X {
// class X can see private members of object X
// Prefix to call
def m(x: Int) = X.f(x)
// Import and use
import X._
def n(x: Int) = f(x)
private def o = 2
}
object X {
private def f(x: Int) = x * x
// object X can see private members of class X
def g(x: X) = {
import x._
x.o * o // fully specified and imported
}
}
objectキーワードは、単一の名前付きインスタンスしか持たないクラスのような新しいシングルトンタイプを作成します。 Javaに精通している場合 、Scalaでオブジェクトを宣言することは、匿名クラスの新しいインスタンスを作成するのとよく似ています。
ScalaにはJavaの静的キーワードと同等のものはなく、Javaで静的メンバーを持つクラスを使用することがあるScalaではオブジェクトがよく使用されます。
あなたがJavaのバックグラウンドから来ているのであれば、スカラのクラスの概念はJavaと似ていますが、スカラのクラスは静的なメンバーを含んでいます。
スカラのオブジェクトはシングルトン型であり、オブジェクト名を使用してその中のメソッドを呼び出す、スカラオブジェクトはキーワードであり、Javaオブジェクトではクラスのインスタンスです
オブジェクトにはちょうど1つのインスタンスがあります( new MyObject
呼び出すことはできません)。 クラスの複数のインスタンスを持つことができます。
オブジェクトは、Javaの静的メソッドおよびフィールドと同じ (および追加の) 目的を果たします。
クラスとオブジェクト:クラスは、エンティティまたはオブジェクトのすべての属性を記述する定義です。 オブジェクトはクラスのインスタンスです。
スカラーでは、 static
概念はありません。 したがって、スカラは、プログラムの実行にエントリポイントを提供するためのシングルトンオブジェクトを作成します。 シングルトンオブジェクトを作成しないと、コードは正常にコンパイルされますが、出力は生成されません。 Singleton Object内で宣言されたメソッドは、グローバルにアクセス可能です。 シングルトンオブジェクトは、クラスと特性を拡張することができます。
Scalaシングルトンオブジェクトの例
object Singleton{
def main(args:Array[String]){
SingletonObject.hello() // No need to create object.
}
}
object SingletonObject{
def hello(){
println("Hello, This is Singleton Object")
}
}
出力:
Hello, This is Singleton Object
スカラーでは、シングルトンオブジェクトと同じ名前のクラスがある場合はコンパニオンクラスと呼ばれ、シングルトンオブジェクトはコンパニオンオブジェクトと呼ばれます。
コンパニオンクラスとそのコンパニオンオブジェクトは、どちらも同じソースファイルで定義する必要があります。
Scala Companionオブジェクトの例
class ComapanionClass{
def hello(){
println("Hello, this is Companion Class.")
}
}
object CompanoinObject{
def main(args:Array[String]){
new ComapanionClass().hello()
println("And this is Companion Object.")
}
}
出力:
Hello, this is Companion Class.
And this is Companion Object.
スカラーでは、クラスには次のものが含まれます。
1.データメンバー
メンバーメソッド
3.コンストラクタブロック
4.ネストされたクラス
5.スーパークラス情報など
クラス内のすべてのインスタンス変数を初期化する必要があります。 デフォルトスコープはありません。 アクセス範囲を指定しない場合は、公開されます。 mainメソッドが定義されているオブジェクトが存在する必要があります。 あなたのプログラムの出発点です。 ここでは、クラスの例を作成しました。
クラスのScalaサンプルの例
class Student{
var id:Int = 0; // All fields must be initialized
var name:String = null;
}
object MainObject{
def main(args:Array[String]){
var s = new Student() // Creating an object
println(s.id+" "+s.name);
}
}
申し訳ありませんが、私は遅すぎますが、それがあなたを助けることを願っています。
形式的差異 -
- オブジェクトのコンストラクタパラメータを指定することはできません
- オブジェクトは型ではありません。新しい演算子でインスタンスを作成することはできません。 しかし、フィールド、メソッドを持ち、スーパークラスを拡張し、特性を混在させることができます。
使い方の違い:
- Scalaには静的メソッドやフィールドはありません。 代わりに
object
を使用する必要がありobject
。 関連クラスの有無にかかわらず使用できます。 1番目のケースでは、それはコンパニオンオブジェクトと呼ばれます。 必ず:- クラスとオブジェクトの両方に同じ名前を使用する
- それらを同じソースファイルに入れてください。
プログラムを作成するには、
class
内ではなくobject
内にmainメソッドを使用する必要があります。object Hello { def main(args: Array[String]) { println("Hello, World!") } }
また、Javaでシングルトンオブジェクトを使用するときにも使用できます。