scala - 同名 - シングルトンオブジェクト




Scalaのオブジェクトとクラスの違い (9)

私はちょうどインターネット上のいくつかのScalaチュートリアルを調べていますが、いくつかの例では、例の始めにオブジェクトが宣言されています。

Scalaのclassobject違いは何ですか?


tl; dr

  • class CはJavaやC ++と同様にクラスを定義します。
  • object Oは、いくつかの匿名クラスのインスタンスとしてsingleton object O作成します。 クラスのインスタンスに関連付けられていない静的メンバーを保持するために使用できます。
  • object O extends Tをオブジェクトobject O extends Tのインスタンスにobject O extends Tする。 あなたはどこにでもOを渡すことができ、 Tが期待されます。
  • class Cがある場合、 object CはクラスC コンパニオンオブジェクトです。 コンパニオンオブジェクトは自動的にCインスタンスではないことに注意してください。

Scalaのobjectclassドキュメントも参照してください。

静的メンバーのホストとしての使用

ほとんどの場合、あるクラスのインスタンスを最初にインスタンス化しなくても利用可能なメソッドと値/変数を保持する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 {
  ...
}

この宣言はまず、 BC両方を拡張する匿名(アクセスできない)クラスを宣言し、 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のソースコードからは見えませんが、リフレクションを通して得ることができます。

objectclass間には関係があり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);  
    }  
} 

申し訳ありませんが、私は遅すぎますが、それがあなたを助けることを願っています。


形式的差異 -

  1. オブジェクトのコンストラクタパラメータを指定することはできません
  2. オブジェクトは型ではありません。新しい演算子でインスタンスを作成することはできません。 しかし、フィールド、メソッドを持ち、スーパークラスを拡張し、特性を混在させることができます。

使い方の違い:

  • Scalaには静的メソッドやフィールドはありません。 代わりにobjectを使用する必要がありobject 。 関連クラスの有無にかかわらず使用できます。 1番目のケースでは、それはコンパニオンオブジェクトと呼ばれます。 必ず:
    1. クラスとオブジェクトの両方に同じ名前を使用する
    2. それらを同じソースファイルに入れてください。
  • プログラムを作成するには、 class内ではなくobject内にmainメソッドを使用する必要があります。

    object Hello {
      def main(args: Array[String]) {
        println("Hello, World!")
      }
    }
    
  • また、Javaでシングルトンオブジェクトを使用するときにも使用できます。







object