为什么需要谨慎使用“protected”关键字

4
在《Java 核心技术卷I》一书中提到...
引用块: protected 关键字应该谨慎使用。如果你设置了一个带有 protected 字段的类,那么如果你想要更改它,你必须通知所有使用这个类的程序员。
我不明白。如果 Son extends Father,并且 Father 已经修改,Son 没有受到影响。是这样吗?

一个好奇的声明。需要谨慎使用的不是关键字,而是继承关系。 - user207421
2个回答

6

例子:如果父亲有一个保险柜并给了儿子组合密码。儿子可以从保险柜里拿钱而不通知父亲,或者反过来也一样。无论哪种方式,都不能保证儿子从保险柜里取钱会告诉父亲。

另一方面,如果儿子总是向父亲要钱,那么父亲就可以跟踪开销并控制资金的使用。

这等同于封装。始终最佳实践是保持字段为私有,并公开或保护方法。这样,负责人(字段声明位置)可以隐藏字段修改的详细信息,但可以提供与调用方法相关的信息访问权限。

这还可以保护未来的更改。例如,假设您有一个名为total的字段。如果直接访问该字段,您无法保证该字段没有被错误地修改并引入错误。但是,如果只通过一个方法()访问,则可以更改计算方式,并且调用该方法的任何人都不受影响并从更改中受益。


1

我无法理解。如果儿子继承了父亲,而父亲发生了变化,儿子是否不会受到影响?

简短回答是:对于一般情况来说,不是这样的!

假设您在源代码的版本1中有两个描述类:

版本1

class Father { protected int asdf; }
class Son extends Father { int qwer = 2 * asdf; }

现在让我们修改Father的受保护字段asdf

版本2

class Father { protected int fdsa; }
class Son extends Father { int qwer = 2 * asdf; } // compile error

现在您必须同时更改Son,以确保它影响子类。

让我们考虑一个库,我们假设您正在大量使用。假设您从核心库类派生了20个类。下一次库的更新可能会导致这20个类也必须更改。这是因为受保护的内容破坏了封装性。

进一步阅读

有几个很好的资源描述了这个问题的所有精彩细节,可以在程序员SE网络上找到一个很好的总结here。现在我试着更加简要地概括一下。

使用protected倾向于;

  1. 导致YAGNI问题。
  2. 导致LSP问题。
  3. 违反OCP
  4. 设计中更偏向继承而非组合。
  5. 导致更多SRP的违规。

另一个好的参考资料是罗伯特·C·马丁(又名“叔叔鲍勃”)的Clean Code


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接