scala中的默认公共访问

时间:2011-01-11 10:38:47

标签: java scala

我读到scala中没有package-private(默认为Java),默认情况下使用公共访问。

这种选择的理由是什么?这是一个很好的做法,因为默认的公共访问使一切都可见,因此是API的一部分?

这意味着要封装字段和方法的额外输入(无论是私有,作用域私有,受保护,访问)。

4 个答案:

答案 0 :(得分:26)

在Java中,选择'package-private'作为默认设置要容易得多,因为它只有三种可能性中的一种。

在Scala中,您可以选择公共访问(public),具有继承的包私有访问(protected[C]),没有继承的包私有访问(private[C]),类私有访问(private),对象 - 私有访问(private[this]),继承访问(protected),protected[this]访问(无论你可以称之为什么),另外,你有某种文件私有访问修饰符(sealed)。

很难从public以外的其他选项中选择默认值。

(考虑到内部方法,还可以将 method-private 添加到列表中......)

答案 1 :(得分:5)

尽管与嵌套类相关的一些Java可见性规则无法转换为Scala,但Scala在选择Java的可见性方面具有更大的灵活性。

而且,是的,Scala中有package-private。它在Scala中写为private[package]

Scala使public成为默认值的原因是因为它是最常用的可见性。 “额外输入”实际上是 less 输入,因为将成员设为私有或受保护的情况更为罕见。

Java中该规则的一个例外是字段,这些字段应该是私有的,因此可以在不破坏客户端的情况下更改实现细节。这样做的一个实际结果是带有字段的类,然后是每个字段的getter和setter。

在Scala中,因为可以将valvar替换为相应的def,所以不需要这样做。

答案 2 :(得分:2)

这给很多人带来了麻烦。我建议给this条目(实际上是整个系列)一个阅读。

不可变性还可以防止通常在此类访问中出现的任何漏洞。可能确实“有更多的打字”,但是看看IDE,他们负责很多因为IDE的任何生成方法通常是公开的,这也不总是有效的。

答案 3 :(得分:1)

根据Programming Scala,默认公开似乎主要归因于uniform access principle,其中运算符重载允许将getter定义为field = newvalue