我读到scala中没有package-private(默认为Java),默认情况下使用公共访问。
这种选择的理由是什么?这是一个很好的做法,因为默认的公共访问使一切都可见,因此是API的一部分?
这意味着要封装字段和方法的额外输入(无论是私有,作用域私有,受保护,访问)。
答案 0 :(得分:26)
在Java中,选择'package-private'作为默认设置要容易得多,因为它只有三种可能性中的一种。
在Scala中,您可以选择公共访问(public
),具有继承的包私有访问(protected[C]
),没有继承的包私有访问(private[C]
),类私有访问(private
),对象 - 私有访问(private[this]
),继承访问(protected
),protected[this]
访问(无论你可以称之为什么),另外,你有某种文件私有访问修饰符(sealed
)。
很难从public
以外的其他选项中选择默认值。
(考虑到内部方法,还可以将 method-private 添加到列表中......)
答案 1 :(得分:5)
而且,是的,Scala中有package-private。它在Scala中写为private[package]
。
Scala使public
成为默认值的原因是因为它是最常用的可见性。 “额外输入”实际上是 less 输入,因为将成员设为私有或受保护的情况更为罕见。
Java中该规则的一个例外是字段,这些字段应该是私有的,因此可以在不破坏客户端的情况下更改实现细节。这样做的一个实际结果是带有字段的类,然后是每个字段的getter和setter。
在Scala中,因为可以将val
或var
替换为相应的def
,所以不需要这样做。
答案 2 :(得分:2)
这给很多人带来了麻烦。我建议给this条目(实际上是整个系列)一个阅读。
不可变性还可以防止通常在此类访问中出现的任何漏洞。可能确实“有更多的打字”,但是看看IDE,他们负责很多因为IDE的任何生成方法通常是公开的,这也不总是有效的。
答案 3 :(得分:1)
根据Programming Scala,默认公开似乎主要归因于uniform access principle,其中运算符重载允许将getter定义为field = newvalue