"новые" ключевое слово в Scala



У меня очень простой вопрос - когда мы должны применять новое ключевое слово при создании объектов в Scala? Это когда мы пытаемся создать экземпляр только объектов Java?

543   2  

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

    Ничего не найдено.