2 ответов:
использовать
newключевое слово, когда вы хотите обратиться кclassсобственный конструктор:class Foo { } val f = new Fooпропустить
newесли вы имеете в виду товарища объектаapplyспособ:class Foo { } object Foo { def apply() = new Foo } // Both of these are legal val f = Foo() val f2 = new Fooесли вы создали класс case:
case class Foo()Scala тайно создает сопутствующий объект для вас, превращая его в это:
class Foo { } object Foo { def apply() = new Foo }так что вы можете сделать
f = Foo()наконец, имейте в виду, что нет правила, которое говорит, что компаньон
applyметод должен быть прокси для конструктора:class Foo { } object Foo { def apply() = 7 } // These do different things > println(new Foo) test@5c79cc94 > println(Foo()) 7и, поскольку вы упомянули классы Java: да -- классы Java редко имеют сопутствующие объекты с
applyметод, поэтому вы должны использоватьnewи фактическим конструктор класса.
это когда мы пытаемся создать экземпляр объектов java только?
вовсе нет. Есть два основных случаях, когда вы оммит
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 classes (на самом деле, под ним есть класс + объект = спутник шаблон, например, имеющий класс и объект с то же имя):
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@10ee5b8 scala> res2.bar res3: java.lang.String = baz
Comments