《Java安全编码标准》一3.2 DCL01-J不要重用Java标准库的已经公开的标识

简介: 本节书摘来自华章出版社《Java安全编码标准》一书中的第3章,第3.2节,作者 (美)Fred Long,Dhruv Mohindra,Robert C. Seacord,Dean F. Sutherland,David Svoboda,更多章节内容可以访问云栖社区“华章计算机”公众号查看

3.2 DCL01-J不要重用Java标准库的已经公开的标识

不要重用那些在Java标准库中已经使用过的公共的标识、公共的工具类、接口或者包。
当一个程序员使用和公开类相同的名字时,如Vector对后来的维护者来说,他可能不知道这个标识并不是指?java.util.Vector?,并且可能会无意地使用这个自定义的Vector类而不是原有的java.util.Vector类。使得这个自定义的?Vector会遮蔽java.util.Vector类,正如在JLS的6.3.2节中提到的那样。从而会导致不可预期的程序行为。
良好定义的import语句可以解决这个问题。然而,当重用的命名定义是从其他包中导入时,使用type-import-on-demand declaration(详细参见JLS的7.5.2节“Type-Import-on-Demand Declaration”[JLS 2005])会将程序员弄糊涂,因为他需要确定哪一个定义是想要的。另外,因为我们通常会使IDE来自动包括import语句,所以一种常见的操作是在编写代码后才生成这些import语句,但这种做法容易导致错误。在Java包含的import引用路径中,如果在预期的类出现之前出现了一个自定义的类,那么不会进一步搜索,这样就会毫无知觉地使用了错误的类。

3.2.1 不符合规则的代码示例(类名称)

这个不符合规则的代码实现了一个类,这个类重用了java.util.Vector 的名称。它在isEmpty()中使用了一个不同的条件判断,尝试通过重写java.util.Vector中对应的方法来达到与遗留代码接口的目的。如果维护者混淆了这个isEmpty()和java.util.Vector. isEmpty(),就会出现不可预知的行为。

class Vector {
??private int val = 1;

??public boolean isEmpty() {
????if (val == 1) {???// compares with 1 instead of 0
??????return true;
????} else {
??????return false;
????}
??}
??// other functionality is same as java.util.Vector
}

// import java.util.Vector; omitted
public class VectorUser {
??public static void main(String[] args) {
????Vector v = new Vector();
????if (v.isEmpty()) {
??????System.out.println("Vector is empty");
????}
??}
}
AI 代码解读

3.2.2 符合规则的方案(类名称)

这个符合规则的方案为这个类使用了不同的名字,防止这个类作为任何潜在的Java标准类库中的类名称的遮蔽情况出现。

class MyVector {
??// other code
}
AI 代码解读

当程序员和开发团队可以控制那些被模仿的原始类,更好的方法就是改变对它们的设计策略,这些策略可以根据Bloch的《Effective Java》[Bloch 2008]一书中第16条,更倾向于接口而不是抽象类的方法来实现。将原始类改变成接口,这可以让MyVector类得以通过声明它是我们假设的接口Vector?的实现。这可以让使用MyVector的代码与使用原始Vector实现的代码互相兼容。

3.2.3 风险评估

重用公有的标识会降低代码的可读性和可维护性。
image

自动化检测 对于重用了Java标准类库中公共类和接口的名字的问题,它们可以被自动检测工具很容易地检测到。

3.2.4 相关规范

image

3.2.5 参考书目

image

目录
打赏
0
0
0
0
1408
分享
相关文章
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
Java智慧工地(源码):数字化管理提升施工安全与质量
随着科技的发展,智慧工地已成为建筑行业转型升级的重要手段。依托智能感知设备和云物互联技术,智慧工地为工程管理带来了革命性的变革,实现了项目管理的简单化、远程化和智能化。
66 5
Java 访问数据库的奇妙之旅
本文介绍了Java访问数据库的几种常见方式
61 12
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
96 2
|
5月前
|
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
163 6
|
5月前
|
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
95 4
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
516 0
在Java中处理JSON数据:Jackson与Gson库比较
Java 泛型深入解析:类型安全与灵活性的平衡
Java 泛型通过参数化类型实现了代码重用和类型安全,提升了代码的可读性和灵活性。本文深入探讨了泛型的基本原理、常见用法及局限性,包括泛型类、方法和接口的使用,以及上界和下界通配符等高级特性。通过理解和运用这些技巧,开发者可以编写更健壮和通用的代码。
Java Jackson-jr库使用介绍
Jackson-jr是专为资源受限环境设计的轻量级JSON处理库,适用于微服务、移动应用及嵌入式系统。它通过牺牲部分高级功能实现了更小体积和更快启动速度,非常适合对库大小敏感的项目。本文将介绍如何使用Jackson-jr进行JSON序列化与反序列化,并演示处理嵌套对象与数组的方法。此外,还介绍了自定义序列化与反序列化的技巧以及性能与功能的权衡。通过示例代码,展示了Jackson-jr在常见任务中的高效与灵活性。
69 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等