【发布时间】:2011-01-11 10:38:46
【问题描述】:
我读到 scala 中没有包私有(Java 中默认),默认使用公共访问。
做出这种选择的理由是什么?这是一个很好的做法,因为默认的公共访问使所有内容都可见,因此是 API 的一部分?
这意味着需要额外的类型来封装字段和方法(无论是私有的、作用域私有的、受保护的还是可访问的)。
【问题讨论】:
我读到 scala 中没有包私有(Java 中默认),默认使用公共访问。
做出这种选择的理由是什么?这是一个很好的做法,因为默认的公共访问使所有内容都可见,因此是 API 的一部分?
这意味着需要额外的类型来封装字段和方法(无论是私有的、作用域私有的、受保护的还是可访问的)。
【问题讨论】:
在 Java 中,选择“package-private”作为默认值要容易得多,因为它是那里仅有的三种可能性之一。
在 Scala 中,您可以选择公共访问 (public)、带继承的包私有访问 (protected[C])、不带继承的包私有访问 (private[C])、类私有访问 (private) 、对象私有访问 (private[this])、继承访问 (protected)、protected[this] 访问(无论你怎么称呼它),此外,您还有某种文件私有访问修饰符 (sealed)。
除了public 之外,很难从中选择默认值。
(考虑到内部方法,也可以将 method-private 添加到列表中……)
【讨论】:
private[C]?而且,既然你可以嵌套包,那么C 会是哪个包或类?最外层是无用的,最内层是定义成员的类,所以它只是private。当然仍然是一个有效的选择;尤其是包装问题。
Scala 在选择某些东西的可见性方面比 Java 具有更大的灵活性,尽管一些与嵌套类相关的 Java 可见性规则无法转换为 Scala。
而且,是的,Scala 中有包私有。它在 Scala 中写成private[package]。
Scala 之所以将public 设为默认值,是因为它是最常用的可见性。 “额外输入”实际上是 less 输入,因为将成员设为私有或受保护的情况要少得多。
Java 中该规则的一个例外是字段,应将其设为私有,以便可以在不破坏客户端的情况下更改实现细节。这样做的一个实际结果是类具有字段,然后是每个字段的 getter 和 setter。
在 Scala 中,因为可以将 val 或 var 替换为对应的 def,所以不需要这样做。
【讨论】:
it is far more uncommon to make members private or protected 对于带有 getter 和/或 setter 的属性可能是正确的,但在一般情况下我不同意。私有实现细节比公共 API 多得多,因为 API 公开了更高级别的方法
这给很多人带来了一些麻烦。我建议阅读this 条目(实际上是整个系列)。
不变性还可以防止这种访问通常发生的任何有趣的事情。 “有更多的输入”可能是真的,但看看 IDE,它们会造成很多麻烦,因为 IDE 生成的任何方法通常都是公共的,这也并不总是有效的。
【讨论】:
根据Programming Scala,似乎默认公共主要是由于uniform access principle,其中运算符重载允许将getter定义为field = newvalue
【讨论】:
public。