У меня очень простой вопрос - когда мы должны применять ключевое слово new при создании объектов в Scala? Это когда мы пытаемся создать только объекты Java?
scala
new-operator
keyword
Bober02
источник
источник
Не за что. Есть два общих случая, когда вы пропускаете
new
в scala. С одноэлементными объектами (которые часто используются для хранения статических функций и как своего рода фабрика, похожая на то, что вы можете видеть в java):scala> object LonelyGuy { def mood = "sad" } defined module LonelyGuy scala> LonelyGuy res0: LonelyGuy.type = LonelyGuy$@3449a8 scala> LonelyGuy.mood res4: java.lang.String = sad
С классами case (на самом деле, внизу есть шаблон class + object = companion , например, имеющий класс и объект с тем же именем):
scala> case class Foo(bar: String) defined class Foo scala> Foo("baz") res2: Foo = Foo(baz)
Поэтому, когда вы работаете с простыми классами, правила такие же, как и в Java.
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")
Бонус, в scala есть анонимные классы, которые можно сконструировать так:
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
источник
Со Scala 3 (который должен быть выпущен в середине 2020 года, восемь лет спустя) на основе Dotty : никогда.
Scala 3 упадет "
new
", как в этой темеclass StringBuilder(s: String) { def this() = this(s) } StringBuilder("abc") // same as new StringBuilder("abc") StringBuilder() // same as new StringBuilder()
источник