gpt4 book ai didi

scala - 私有(private)[此] 与私有(private)

转载 作者:行者123 更新时间:2023-12-03 04:44:21 26 4
gpt4 key购买 nike

在 Scala 中,我看到了对象私有(private)变量这样的功能。从我不太丰富的 Java 背景中,我学会了关闭所有内容(使其私有(private))并在必要时打开(提供访问器)。 Scala 引入了更严格的访问修饰符。我应该始终默认使用它吗?或者我应该仅在某些特定情况下使用它,即使对于同一类的对象,我也需要显式限制更改字段值?换句话说我应该如何选择

class Dummy {
private var name = "default name"
}

class Dummy {
private[this] var name = "default name"
}

第二个更严格,我喜欢它,但我应该始终使用它还是只有在我有充分理由的情况下才使用它?

已编辑:据我所知here private[this] 只是一些子情况,我可以使用其他修饰符代替 this:“包、类或单例对象”。所以我会把它留给一些特殊情况。

最佳答案

有一种情况需要 private[this] 才能使代码编译。这与方差表示法和可变变量的相互作用有关。考虑以下(无用的)类:

class Holder[+T] (initialValue: Option[T]) {
// without [this] it will not compile
private[this] var value = initialValue

def getValue = value
def makeEmpty { value = None }
}

因此,此类旨在保存一个可选值,将其作为选项返回,并使用户能够调用 makeEmpty 来清除该值(因此是 var)。如前所述,除了证明这一点之外,这毫无用处。

如果您尝试使用 private 而不是 private[this] 编译此代码,则会失败并显示以下错误消息:

error: covariant type T occurs in contravariant position in type Option[T] of value value_= class Holder[+T] (initialValue: Option[T]) {

发生此错误的原因是 value 是协变类型 T (+T) 上的可变变量,这通常是一个问题,除非使用 private[this] 将实例标记为私有(private)。编译器在其方差检查中进行了特殊处理来处理这种特殊情况。

所以它很深奥,但在某些情况下,需要 private[this] 而不是 private

关于scala - 私有(private)[此] 与私有(private),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9698677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com