私人与受保护
我一直在寻找,我知道理论上的差异。
这一切都很好,问题是,它们之间的实际区别是什么? 什么时候你会使用private
,你什么时候使用protected
? 有没有一个标准的或可接受的良好做法?
截至目前为止,保留继承和多态的概念,我用public
的东西应该访问来自外部(如构造和主类的功能),以及protected
的内部方法(逻辑,辅助方法等)。 我在正确的轨道上吗?
(请注意,这个问题对我来说,但也为未来的参考,因为我没有看到像这样的问题)。
不,你不在正确的轨道上。 一个好的经验法则是:尽可能使所有内容尽可能私密。 这使得你的类更加封装,并且允许改变类的内部,而不会影响你的类的代码。
如果您将类设计为可继承的,那么请仔细选择可能被子类重写并可访问的对象,并使其受保护(如果要让Java可访问但不可覆盖,则最终谈论Java)。 但请注意,只要您接受具有您的类的子类,并且存在受保护的字段或方法,此字段或方法就是该类的公共API的一部分,并且以后可能不会更改而不会破坏子类。
一个不打算被继承的类应该是最终的(用Java)。 为了进行单元测试,您可以放松一些访问规则(私有受保护,最终到非最终),然后将其记录下来,并且明确指出虽然该方法受保护,但不应该被覆盖。
让我先说这个,我说的主要是关于这里的方法访问权限,在稍微小一点的程度上,最终标记类, 而不是成员访问。
旧智慧
“除非你有充分的理由不要”
在开放源代码占据开发者库空间和VCS /依赖性管理之前,在编写它的日子里有意义。 由于Github,Maven等成为了超级协作。当时还有钱可以通过限制图书馆的使用方式来实现。 我大概在我职业生涯的前8或9年严格遵守这个“最佳做法”。
今天,我认为这是不好的建议。 有时候有一个合理的论点来标记一个私有方法或者类最终的方法,但它非常罕见,即使这样,它也可能没有改进任何东西。
你有没有:
这些是我听说默认标记私有方法的三大理由:
合理化#1:这是不安全的,并且没有可以想象的理由来覆盖特定的方法
我无法计算出我是否曾经有必要重写我编写的特定方法的错误次数。 在研究过几种流行的开源库之后,我学会了将事物标记为私有的真正成本的难题。 它通常消除了对未发现的问题或用例的唯一实际解决方案。 相反,我从未参与过16年以上的职业发展,但由于与API安全性有关的原因,我没有对保护而不是私人的方法表示遗憾。 当开发人员选择扩展课程并覆盖某个方法时,他们有意识地说“我知道我在做什么”。 并且为了生产力应该足够。 期。 如果危险,请在班级/方法Javadocs中记下,不要盲目地关上门。
标记方法默认保护是对现代软件开发中一个主要问题的缓解:想象力的失败。
合理化#2:它保持公共API / Javadocs的清洁
这实际上是非常合理的,并且根据目标受众甚至可能是正确的做法,但值得考虑的是保持API“干净”的成本实际上是:可扩展性。 由于上述原因,为了以防万一,默认情况下保护默认设置可能仍然有意义。
合理化#3:我的软件是商业的,我需要限制它的使用。
这个其实很合理。 作为消费者,尽管我每次都会与限制较少的竞争对手(假设没有明显的质量差异)一起去。
永不说永不
我不是说永远不要将方法标记为私有。 我断言,更好的经验法则是“除非有充分的理由不要保护方法”。
这种建议最适合那些从事图书馆或大型项目的人员,这些项目已被分解为模块。 对于规模较小或更多的整体项目,由于您无论如何都控制了所有代码,因此它并不重要,并且如果/需要时更改代码的访问级别很容易。 尽管如此,我仍然会给出相同的建议:-)
我前段时间看过一篇文章,谈到尽可能地锁定每个班级。 除非您立即需要向外部世界公开某些数据或功能,否则将所有内容都设为最终和私有。 将范围扩展到稍后允许的范围总是很容易的,但不是相反。 首先考虑尽可能多的事情做final
,这将使private
和protected
之间的选择更容易。
现在,如果你剩下的是最后一堂课,那么除非世界上绝对需要一些东西 - 让它公开,否则一切都是私人的。
如果你留下了一个具有子类的类,那么仔细检查每个属性和方法。 首先考虑是否要将该属性/方法公开给子类。 如果你这样做,那么考虑如果子类在重写过程中混淆了属性值或方法实现,那么是否会对你的对象造成严重破坏。 如果可能,并且想要保护班级的财产/方法甚至不受子类的影响(听起来颇具讽刺意味,我知道),然后将其设为私有。 否则,请保护它。
免责声明:我不用Java编程太多:)
链接地址: http://www.djcxy.com/p/31493.html上一篇: Private vs Protected
下一篇: Initialize a byte array to a certain value, other than the default null?