私人与受保护

我一直在寻找,我知道理论上的差异。

  • public - 任何类/函数都可以访问方法/属性。
  • 保护 - 只有这个类和任何子类可以访问方法/属性。
  • 私人 - 只有这个类可以访问方法/属性。 它甚至不会被继承。
  • 这一切都很好,问题是,它们之间的实际区别是什么? 什么时候你会使用private ,你什么时候使用protected ? 有没有一个标准的或可接受的良好做法?

    截至目前为止,保留继承和多态的概念,我用public的东西应该访问来自外部(如构造和主类的功能),以及protected的内部方法(逻辑,辅助方法等)。 我在正确的轨道上吗?

    (请注意,这个问题对我来说,但也为未来的参考,因为我没有看到像这样的问题)。


    不,你不在正确的轨道上。 一个好的经验法则是:尽可能使所有内容尽可能私密。 这使得你的类更加封装,并且允许改变类的内部,而不会影响你的类的代码。

    如果您将类设计为可继承的,那么请仔细选择可能被子类重写并可访问的对象,并使其受保护(如果要让Java可访问但不可覆盖,则最终谈论Java)。 但请注意,只要您接受具有您的类的子类,并且存在受保护的字段或方法,此字段或方法就是该类的公共API的一部分,并且以后可能不会更改而不会破坏子类。

    一个不打算被继承的类应该是最终的(用Java)。 为了进行单元测试,您可以放松一些访问规则(私有受保护,最终到非最终),然后将其记录下来,并且明确指出虽然该方法受保护,但不应该被覆盖。


    让我先说这个,我说的主要是关于这里的方法访问权限,在稍微小一点的程度上,最终标记类, 而不是成员访问。

    旧智慧

    “除非你有充分的理由不要”

    在开放源代码占据开发者库空间和VCS /依赖性管理之前,在编写它的日子里有意义。 由于Github,Maven等成为了超级协作。当时还有钱可以通过限制图书馆的使用方式来实现。 我大概在我职业生涯的前8或9年严格遵守这个“最佳做法”。

    今天,我认为这是不好的建议。 有时候有一个合理的论点来标记一个私有方法或者类最终的方法,但它非常罕见,即使这样,它也可能没有改进任何东西。

    你有没有:

  • 被一个图书馆等感到失望/惊讶/伤害,它有一个可以通过继承和几行代码修复的错误,但由于私人/最终方法和类被迫等待官方补丁?
  • 想要使用一个与作者想像的稍微不同的用例库,但由于私有/最终方法和类而无法这样做?
  • 被图书馆等感到失望/惊讶/伤害,它在可扩展性方面过分宽容吗?
  • 这些是我听说默认标记私有方法的三大理由:

    合理化#1:这是不安全的,并且没有可以想象的理由来覆盖特定的方法

    我无法计算出我是否曾经有必要重写我编写的特定方法的错误次数。 在研究过几种流行的开源库之后,我学会了将事物标记为私有的真正成本的难题。 它通常消除了对未发现的问题或用例的唯一实际解决方案。 相反,我从未参与过16年以上的职业发展,但由于与API安全性有关的原因,我没有对保护而不是私人的方法表示遗憾。 当开发人员选择扩展课程并覆盖某个方法时,他们有意识地说“我知道我在做什么”。 并且为了生产力应该足够。 期。 如果危险,请在班级/方法Javadocs中记下,不要盲目地关上门。

    标记方法默认保护是对现代软件开发中一个主要问题的缓解:想象力的失败。

    合理化#2:它保持公共API / Javadocs的清洁

    这实际上是非常合理的,并且根据目标受众甚至可能是正确的做法,但值得考虑的是保持API“干净”的成本实际上是:可扩展性。 由于上述原因,为了以防万一,默认情况下保护默认设置可能仍然有意义。

    合理化#3:我的软件是商业的,我需要限制它的使用。

    这个其实很合理。 作为消费者,尽管我每次都会与限制较少的竞争对手(假设没有明显的质量差异)一起去。

    永不说永不

    我不是说永远不要将方法标记为私有。 我断言,更好的经验法则是“除非有充分的理由不要保护方法”。

    这种建议最适合那些从事图书馆或大型项目的人员,这些项目已被分解为模块。 对于规模较小或更多的整体项目,由于您无论如何都控制了所有代码,因此它并不重要,并且如果/需要时更改代码的访问级别很容易。 尽管如此,我仍然会给出相同的建议:-)


    我前段时间看过一篇文章,谈到尽可能地锁定每个班级。 除非您立即需要向外部世界公开某些数据或功能,否则将所有内容都设为最终和私有。 将范围扩展到稍后允许的范围总是很容易的,但不是相反。 首先考虑尽可能多的事情做final ,这将使privateprotected之间的选择更容易。

  • 让所有的类都是最终的,除非你需要立即对它们进行子类化。
  • 使所有方法都是最终的,除非您需要子类并立即覆盖它们。
  • 使所有的方法参数都是最终的,除非你需要在方法的主体内改变它们,这在大多数情况下都是有点尴尬的。
  • 现在,如果你剩下的是最后一堂课,那么除非世界上绝对需要一些东西 - 让它公开,否则一切都是私人的。

    如果你留下了一个具有子类的类,那么仔细检查每个属性和方法。 首先考虑是否要将该属性/方法公开给子类。 如果你这样做,那么考虑如果子类在重写过程中混淆了属性值或方法实现,那么是否会对你的对象造成严重破坏。 如果可能,并且想要保护班级的财产/方法甚至不受子类的影响(听起来颇具讽刺意味,我知道),然后将其设为私有。 否则,请保护它。

    免责声明:我不用Java编程太多:)

    链接地址: http://www.djcxy.com/p/31493.html

    上一篇: Private vs Protected

    下一篇: Initialize a byte array to a certain value, other than the default null?