Mam bardzo proste pytanie - kiedy powinniśmy stosować nowe słowo kluczowe podczas tworzenia obiektów w Scali? Czy dzieje się tak, gdy próbujemy utworzyć tylko instancje obiektów Java?
scala
new-operator
keyword
Bober02
źródło
źródło
Ani trochę. Są dwa ogólne przypadki, w których pomijasz
new
w scali . Z obiektami pojedynczymi (które są często używane do przechowywania funkcji statycznych i jako rodzaj fabryki podobnej do tego, co można zobaczyć w Javie):scala> object LonelyGuy { def mood = "sad" } defined module LonelyGuy scala> LonelyGuy res0: LonelyGuy.type = LonelyGuy$@3449a8 scala> LonelyGuy.mood res4: java.lang.String = sad
Z klasami przypadków (właściwie pod spodem znajdują się class + object = companion pattern, np. Posiadające klasę i obiekt o tej samej nazwie):
scala> case class Foo(bar: String) defined class Foo scala> Foo("baz") res2: Foo = Foo(baz)
Więc kiedy pracujesz z prostymi klasami, reguły są takie same jak w Javie.
scala> class Foo(val bar: String) defined class Foo scala> new Foo("baz") res0: Foo = Foo@2ad6a0 // will be a error scala> Foo("baz") <console>:8: error: not found: value Foo Foo("baz")
Bonus, w scali są anonimowe klasy, które można zbudować w następujący sposób:
scala> new { val bar = "baz" } res2: java.lang.Object{val bar: java.lang.String} = $anon$1@10ee5b8 scala> res2.bar res3: java.lang.String = baz
źródło
Ze Scalą 3 (która powinna ukazać się w połowie 2020 roku, osiem lat później), opartą na Dotty : nigdy.
Scala 3 opuści „
new
”, jak w tym wątkuclass StringBuilder(s: String) { def this() = this(s) } StringBuilder("abc") // same as new StringBuilder("abc") StringBuilder() // same as new StringBuilder()
źródło