스칼라 생성자 매개 변수의 기본값은 private val입니까?


128

나는 노력하고있다 :

class Foo(bar: Int)

vs :

class Foo(private val bar: Int)

그리고 그들은 어디에서나 (bar: Int)확장 할 수 없다는 것을 알지 못하더라도 동일하게 행동하는 것 같습니다. (private val bar: Int)제 질문은 동일합니까?

참고로, -Xprint:typer이 코드 조각에 사용하려고 시도 했으며 두 번째 코드의 추가 줄을 제외하고 동일한 코드를 생성합니다. 그 여분의 줄을 어떻게 읽습니까?

..
class Foo extends scala.AnyRef {
  <paramaccessor> private[this] val bar: Int = _;
  def <init>(bar: Int): this.Foo = {
    Foo.super.<init>();
    ()
  }
}
..


..
class Foo extends scala.AnyRef {
  <paramaccessor> private[this] val bar: Int = _;
  <stable> <accessor> <paramaccessor> private def bar: Int = Foo.this.bar;
  def <init>(bar: Int): this.Foo = {
    Foo.super.<init>();
    ()
  }
}
..

답변:


177

bar: Int

이것은 거의 생성자 매개 변수입니다. 이 변수가 생성자를 제외한 다른 곳에서 사용되지 않으면 그대로 남아 있습니다. 필드가 생성되지 않습니다. 그렇지 않으면 private val bar필드가 작성되고 bar매개 변수 값 이 지정됩니다. 게터가 생성되지 않습니다.

private val bar: Int

이러한 매개 변수 선언은 private val bar개인 getter를 사용하여 필드를 만듭니다 . 매개 변수가 생성자 옆에 사용되었는지 여부에 관계없이이 동작은 위와 동일합니다 (예 : 내부 toString()또는 외부).

val bar: Int

위와 동일하지만 스칼라와 같은 게터는 공개입니다

bar: Int 수업의 경우

케이스 클래스가 관련된 경우 기본적으로 각 매개 변수에는 val수정자가 있습니다.


15
클래스의 경우 모든 매개 변수가 "public"이 val됩니다.
drexin

6
어때, 나는 때때로 안경을 쓰지만, 너무 많다.
om-nom-nom

1
@ om-nom-nom : 죄송합니다. 이해가되지 않습니다. 더 읽기 편하도록 서식 / 구조를 개선해야합니까?
Tomasz Nurkiewicz

1
@TomaszNurkiewicz : var는 생성자 매개 변수를 클래스 case및 비 클래스의 (변경 가능) 클래스 속성으로 렌더링하는 데 유용하고 의미가 있습니다 case.
랜달 슐츠

8
책 '스칼라 급한 위해'고 기록 된 bar: Int컴파일private[this] val bar: Int
myTitle이라는

98

첫 번째 경우 bar에는 생성자 매개 변수 만 있습니다. 주요 생성자는 클래스 자체의 내용이므로이 인스턴스에서만 액세스 할 수 있습니다. 따라서 다음과 거의 같습니다.

class Foo(private[this] val bar:Int)

반면에 두 번째 경우 bar에는 일반 개인 필드이므로이 인스턴스 및의 다른 인스턴스에 액세스 할 수 있습니다 Foo. 예를 들어, 이것은 잘 컴파일됩니다.

class Foo(private val bar: Int) {
  def otherBar(f: Foo) {
    println(f.bar) // access bar of another foo
  }
}

그리고 다음을 실행합니다.

scala> val a = new Foo(1)
a: Foo = Foo@7a99d0af

scala> a.otherBar(new Foo(3))
3

그러나 이것은하지 않습니다 :

class Foo(bar: Int) {
  def otherBar(f: Foo) {
    println(f.bar) // error! cannot access bar of another foo
  }
}

9
이것은 받아 들여진 것보다 더 나은 대답입니다. 이는 베어 차이 강조 bar: Intprivate val ....
hraban
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.