私有[this]在scala中提供不带val / var的参数

问题描述

我知道在类中将val / var标记为private [this]并提供没有val / var的类参数是相同的。

 class ABC (x:Int){..}

 class ABC {
   private[this] x:Int = 100
 }

在两种情况下,x只能由同一对象的构造函数方法访问。我的理解正确吗?

谢谢!

解决方法

两者

import scala.reflect.runtime.universe._

reify{
  class ABC(x: Int)
}.tree

reify {
  class ABC(private[this] val x: Int)
}.tree

产生

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

reify{
  class ABC {
    private[this] val x: Int = 100
  }
}.tree

产生

{
  class ABC extends AnyRef {
    def <init>() = {
      super.<init>();
      ()
    };
    private[this] val x: Int = 100
  };
  ()
}

所以您的问题的答案

在两种情况下,x只能由同一对象的构造函数和方法访问。

是肯定的。

您可以检查class ABC(x: Int)是否确实创建了一个(private[this])字段,以确认您可以使用this来访问它

class ABC(x: Int) {
  this.x
}

但是必须强调的是,Scala规范并未指定x中的class ABC(x: Int) 字段,还是不是 领域。这只是Scalac和Dotty编译器的当前行为。

Get the property of parent class in case classes

Disambiguate constructor parameter with same name as class field of superclass

Do scala constructor parameters default to private val?

Scala Constructor Parameters

我知道在类中将val / var标记为private [this]并提供没有val / var的类参数是相同的。

好吧,这不一样,因为使用class ABC(x: Int)时,您有一个接受Int的构造函数。