回答:
ここにいくつかの理由がありますが、あなた自身の好みに応じて、多かれ少なかれ説得力があるかもしれません。
「シンタックスシュガー」であることで単純に値引きしないでください。あなたは何かが単なる構文糖質であると言うかもしれませんが、それは結局、あなたの人生を甘くする糖分です-ちょうどコーヒーまたはお茶を飲む人としてだけでなく、プログラマーとして。
シングルトン-すべてのScala object
は本質的にシングルトンです。Javaの世界では、さまざまな方法でシングルトンを実装しているため、実装に何らかの間違いを犯すことが多いため、Scalaのような単純なエラーを作成することはできません。object
代わりに書くことはclass
それをシングルトンにし、完了です。
静的メソッドへのアクセス:Javaの静的メソッドには、オブジェクトからアクセスできます。たとえばC
、静的メソッドf
とc
typeのオブジェクトを持つクラスがあるとしますC
。次にを呼び出す必要C.f
がありますが、Javaでは(警告はありますが)を使用できます。c.f
オブジェクトにはメソッドがないため、Scalaのバックグラウンドから来たときに意味がありませf
ん。
明確な分離:Javaでは、クラス内で静的属性と非静的属性およびメソッドを混在させることができます。規律を持って作業すれば、これは問題になりませんが、あなた(または他の誰か)がそうしなければ、静的な部分と非静的な部分が交互に配置されることになり、一目でわかりにくくなります静的なものとそうでないもの。Scalaでは、コンパニオンオブジェクト内にあるすべてのものは、対応するクラスのランタイムオブジェクトの一部ではありませんが、静的コンテキストから利用できます。逆に、クラス内で記述されている場合、そのクラスのインスタンスで使用できますが、静的コンテキストからは使用できません。これは、クラスに静的および非静的初期化子ブロックを追加し始めると、Javaで特に負担になります。これは、動的な実行順序の観点から理解するのが非常に困難になる可能性があります。
少ないコード:のすべての属性またはメソッドにstaticという単語を追加する必要がないためobject
、コードをより簡潔に保つことができます(実際、顕著な利点ではありません)。
欠点を見つけるのははるかに困難です。静的部分と非静的部分は一緒に属するべきであるが、コンパニオンオブジェクトのScalaコンセプトによって分離されていると主張するかもしれません。たとえば、クラス図があるのは奇妙に見えるかもしれませんが、コードで2つのものを作成し、どの属性がどこに行くかを分析する必要があります。
ifnonnull
と、単にと比較してetcバイトコードが生成されますinvokeStatic
。
もう1つの利点は、object
静的メソッドとは異なり、インターフェイス/特性を実装できることです。