第50条:在必要时进行防御性复制

💡 原文约400字/词,阅读约需2分钟。
📝

内容提要

Java编程需要防御性编程以防止客户端违反类不变性。在参数验证之前应进行防御性复制以避免漏洞。Getter方法应返回可变对象的防御性副本以防止外部变更。防御性复制也适用于存储客户端提供的可变对象引用的可变类。在返回可变内部组件时,考虑返回防御性副本或不可变视图。尽可能使用不可变对象作为内部组件以避免需要防御性复制。防御性复制可能影响性能,因此可以考虑依赖文档或明确的使用合同等替代方案。使用防御性复制来保护类的完整性,除非成本不切实际或通过明确的文档建立了相互信任。

🎯

关键要点

  • Java编程需要防御性编程,以防止客户端违反类的不变性。
  • 在参数验证之前应进行防御性复制,以避免漏洞。
  • Getter方法应返回可变对象的防御性副本,以防止外部变更。
  • 防御性复制适用于存储客户端提供的可变对象引用的可变类。
  • 返回可变内部组件时,考虑返回防御性副本或不可变视图。
  • 尽可能使用不可变对象作为内部组件,以避免需要防御性复制。
  • 防御性复制可能影响性能,因此可以考虑依赖文档或明确的使用合同等替代方案。
  • 使用防御性复制来保护类的完整性,除非成本不切实际或通过明确的文档建立了相互信任。

延伸问答

什么是防御性编程,它在Java编程中有什么重要性?

防御性编程是指在编程时假设客户端可能会破坏类的不变性,确保类的完整性,防止潜在的漏洞。

在Java中,如何进行防御性复制以避免漏洞?

在参数验证之前进行防御性复制,以确保接收到的可变对象不会被外部修改,从而避免漏洞。

Getter方法应该如何处理可变对象?

Getter方法应返回可变对象的防御性副本,以防止外部对内部状态的修改。

使用不可变对象作为内部组件有什么好处?

使用不可变对象可以避免需要防御性复制,从而提高代码的安全性和性能。

防御性复制可能带来哪些性能影响?

防御性复制可能会影响性能,因此在某些情况下可以考虑依赖文档或明确的使用合同作为替代方案。

在什么情况下可以不使用防御性复制?

当成本不切实际或通过明确的文档建立了相互信任时,可以不使用防御性复制。

➡️

继续阅读