Scala의 "new"키워드
아주 간단한 질문이 있습니다. Scala에서 객체를 만들 때 새 키워드를 언제 적용해야합니까? Java 객체 만 인스턴스화하려고 할 때입니까?
의 자체 생성자 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 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> object LonelyGuy { def mood = "sad" }
defined module LonelyGuy
scala> LonelyGuy
res0: LonelyGuy.type = LonelyGuy$@3449a8
scala> LonelyGuy.mood
res4: java.lang.String = sad
A의 경우는 클래스 (실제로, 아래 객체 클래스 + =있다 컴패니언 동일한 이름 패턴 예 갖는 클래스 오브젝트)
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> new { val bar = "baz" }
res2: java.lang.Object{val bar: java.lang.String} = $anon$1@10ee5b8
scala> res2.bar
res3: java.lang.String = baz
Java 객체 만 인스턴스화하려고 할 때입니까?
Dotty를 기반으로 하는 Scala 3 (2020 년 중반, 8 년 후 출시 예정)을 사용 합니다.
Scala 3 will drop "new
", as in this thread
Creator applications allow to use simple function call syntax to create instances of a class, even if there is no apply method implemented.
Example:
class StringBuilder(s: String) {
def this() = this(s)
}
StringBuilder("abc") // same as new StringBuilder("abc")
StringBuilder() // same as new StringBuilder()
Creator applications generalize a functionality provided so far only for case classes, but the mechanism how this is achieved is slightly different.
Instead of an auto-generated apply method, we add a new possible interpretation to a function callf(args)
.
참고URL : https://stackoverflow.com/questions/9727637/new-keyword-in-scala
'program story' 카테고리의 다른 글
버그 수정을 스크럼 프로세스에 맞추는 가장 좋은 방법은 무엇입니까? (0) | 2020.09.12 |
---|---|
Android 카메라 방향을 올바르게 설정하는 방법은 무엇입니까? (0) | 2020.09.12 |
트위터 부트 스트랩으로 작업하는 HTML 이메일을받은 사람이 있습니까? (0) | 2020.09.12 |
JNDI의 목적은 무엇입니까 (0) | 2020.09.12 |
Python에서 핫 인코딩을 어떻게 할 수 있습니까? (0) | 2020.09.11 |