【问题标题】:Default public access in scalascala中的默认公共访问
【发布时间】:2011-01-11 10:38:46
【问题描述】:

我读到 scala 中没有包私有(Java 中默认),默认使用公共访问。

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

这意味着需要额外的类型来封装字段和方法(无论是私有的、作用域私有的、受保护的还是可访问的)。

【问题讨论】:

    标签: java scala


    【解决方案1】:

    在 Java 中,选择“package-private”作为默认值要容易得多,因为它是那里仅有的三种可能性之一。

    在 Scala 中,您可以选择公共访问 (public)、带继承的包私有访问 (protected[C])、不带继承的包私有访问 (private[C])、类私有访问 (private) 、对象私有访问 (private[this])、继承访问 (protected)、protected[this] 访问(无论你怎么称呼它),此外,您还有某种文件私有访问修饰符 (sealed)。

    除了public 之外,很难从中选择默认值。

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

    【讨论】:

    • 您提出了一个有效的观点,但我仍然想说,尽管 scala 提供了更多更好的(受保护范围内的一致性)选择,但默认值应该是隐藏实现的东西。从这个意义上说,您的声明中没有继承的包私有访问 (private[C])。我不介意额外输入并同意使用 IDE 很容易,但仍然想知道选择的更好理由。
    • 但是您需要多久使用一次private[C]?而且,既然你可以嵌套包,那么C 会是哪个包或类?最外层是无用的,最内层是定义成员的类,所以它只是private。当然仍然是一个有效的选择;尤其是包装问题。
    • 但是,无论如何都很难争论,因为事情就是这样,并没有看起来那么糟糕。
    • 谢谢.. 我会等待更多回复,因为 scala 中的所有功能都经过深思熟虑,这也可能是相同的.. 我还在学习..
    【解决方案2】:

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

    而且,是的,Scala 中有包私有。它在 Scala 中写成private[package]

    Scala 之所以将public 设为默认值,是因为它是最常用的可见性。 “额外输入”实际上是 less 输入,因为将成员设为私有或受保护的情况要少得多。

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

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

    【讨论】:

    • it is far more uncommon to make members private or protected 对于带有 getter 和/或 setter 的属性可能是正确的,但在一般情况下我不同意。私有实现细节比公共 API 多得多,因为 API 公开了更高级别的方法
    【解决方案3】:

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

    不变性还可以防止这种访问通常发生的任何有趣的事情。 “有更多的输入”可能是真的,但看看 IDE,它们会造成很多麻烦,因为 IDE 生成的任何方法通常都是公共的,这也并不总是有效的。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 好吧.. 实际上我在这里 (joelabrahamsson.com/entry/…) 读到编译器插入了一个 getter 用于统一访问。但是访问器仍然是公开的
      • 对于统一访问原则,字段和方法的默认访问级别应该是相等的,它们不需要都是public
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2011-02-26
      • 1970-01-01
      相关资源
      最近更新 更多