《数据结构与抽象:Java语言描述(原书第4版)》一2.1.4 让实现安全

2.1.4 让实现安全

鉴于当今黑客及对重要软件系统未经授权入侵的现实情况,程序员必须在代码中添加安全措施,以使程序对使用者是安全的。虽然Java为你管理内存,检查数组下标的合法性,且是类型安全的,但一个错误会使你的代码易受攻击。实现ADT时应该时刻铭记安全性,尽管在已有的代码中增加安全机制可能是困难的。

注:你可以在程序中检查可能出现的错误来练习有安全机制的程序设计(fail-safe programming)。安全可靠程序设计(safe and secure programming)通过验证输入给方法的数据和参数的合法性,消除方法的副作用,对客户和使用者的行为不做任何假设,来扩展有安全机制的程序设计的概念。
安全说明:保护ADT实现的完整性
当实现一个ADT时,必须问自己的两个问题是

  • 如果构造方法没有完全执行,那么可能会发生什么?例如,构造方法可能在完成初始化之前就抛出一个异常或错误。但是入侵者可能捕获异常或错误,并试图使用部分初始化的对象。
  • 如果客户试图创建一个其容量超出给定范围的包,那么可能会发生什么?
    如果这两个动作可能导致问题,则我们必须阻止它们。

对于类ArrayBag,我们想防范前面安全说明中所描述的两种情形。现在开始细化ArrayBag的不完整的实现,在类中增加下列两个数据域,以使代码更安全:

这两个修改都涉及构造方法。因为默认的构造方法调用带参数的构造方法,所以仅修改后者就足够了。为确保客户不能创建太大的包,构造方法应该检查客户所需包的容量与MAX_CAPACITY值。如果需要的容量太大,则构造方法可以抛出一个异常。
如果所需的容量处在允许范围内,则ArrayBag的构造方法为什么还不能正确完成呢?因为内存不足可能导致分配数组失败。这样一个事件会导致错误OutOfMemoryError。一般地,客户将这个错误看作致命事件。黑客可能捕获这个错误(就像你捕获异常一样),并试图使用部分初始化的对象。为防止这种情况,类的每个重要方法在执行其操作之前都可以检查域initialized的状态。这样,畸形对象就不会再有动作。对于正确初始化的对象,构造方法将把域initialized置为真。
下面是修改后的构造方法。

注意,构造方法在成功完成其他任务后,最后一个动作是将initialized赋值为真。还应注意,IllegalStateException是标准运行时异常。
下面来看看如何使用initialized。
在数组bag已成功分配的基础上,ArrayBag中的任何公有方法在继续执行之前都应该确保数据域initialized的值为真。如果initialized为假,这样的方法可以抛出一个异常。例如,可以如下所示修改方法add。

注:异常SecurityException和IllegalStateException都是包java.lang中的标准运行时异常。因此,不需要import语句。

因为我们将在多个方法中检查initialized,所以为避免代码重复定义下列私有方法。

方法add可以修改为:

应该以相同的方式修改核心方法toArray,因为它用到了ArrayBag的数据域bag。

安全说明:你所熟知的编写Java代码的某些常见准则,实际上增加了代码的安全性。这些准则是:

  • 将类的大多数数据域声明为私有的,如果不是全部。任何公有数据域都应该是静态和终态的,且有常量值。
  • 避免那些掩盖代码安全性的所谓聪明的逻辑。
  • 避免重复代码。相反,将这样的代码封装为一个可供其他方法调用的私有方法。
  • 当构造方法调用一个方法时,确保这个方法不能被重写。

安全说明:终态类。注意,我们将ArrayBag声明为一个终态类。因此,不会有从ArrayBag派生的其他类,即ArrayBag不能是另一个类的父类或基类。终态类比非终态类更安全,因为程序员不能使用继承来改变它的行为。稍后我们将细化这个方法,定义终态方法而不是整个类。

时间: 2024-09-14 19:51:38

《数据结构与抽象:Java语言描述(原书第4版)》一2.1.4 让实现安全的相关文章

《机器学习与R语言(原书第2版)》一2.3 探索和理解数据

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第2章,第2.3节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 2.3 探索和理解数据 在收集数据并把它们载入R数据结构以后,机器学习的下一个步骤是仔细检查数据.在这个步骤中,你将开始探索数据的特征和案例,并且找到数据的独特之处.你对数据的理解越深刻,你将会更好地让机器学习模型匹配你的学习问题. 理解数据探索的最好方法就是通过例子.在

《机器学习与R语言(原书第2版)》一第3章 懒惰学习——使用近邻分类

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第3章,第3.1节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 第3章 懒惰学习--使用近邻分类 一种新型有趣的餐饮体验已经出现在世界各地的城市中,顾客在一个完全黑暗的餐厅里接受服务,而服务员在仅凭触觉和听觉记忆的路上小心地移动.这些餐厅的魅力在于这样的信仰:去掉一个人的视觉感官输入将会增强他的味觉和嗅觉,从而可以使他以一种全新的方式

《机器学习与R语言(原书第2版)》一1.3 机器如何学习

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第1章,第1.3节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 1.3 机器如何学习 机器学习的一个正式定义是由计算机科学家Tom M. Mitchell提出的:如果机器能够获取经验并且能利用它们,在以后的类似经验中能够提高它的表现,这就称为机器学习.尽管这个定义是直观的,但是它完全忽略了经验如何转换成未来行动的过程,当然学习总是说起

《机器学习与R语言(原书第2版)》一1.6 总结

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第1章,第1.6节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 1.6 总结 机器学习起源于统计学.数据库科学和计算机科学的交叉.它是一个强大的工具,能够在大量的数据中找到可行动的洞察.然而,人们仍需持谨慎的态度,避免现实生活中机器学习的普遍滥用. 从概念上讲,机器学习涉及把数据抽象为结构化表示,并把这个结构化表示进行一般化从而推广到

《机器学习与R语言(原书第2版)》一1.5 使用R进行机器学习

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第1章,第1.5节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 1.5 使用R进行机器学习 机器学习所需要的很多算法都没有包含在R的基本安装中.但一个很大社区的专家免费分享他们的机器学习成果,机器学习所需要的算法就是通过这种方式得到.这些必须通过手动方式安装在R基础安装包之上.多亏R是免费的开源软件,没有为这种功能额外收费.那些能在用

《机器学习与R语言(原书第2版)》一 第2章 数据的管理和理解

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第2章,第2.1节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 第2章 数据的管理和理解 任何机器学习项目初期的核心部分都是与管理和理解所收集的数据有关的.尽管你可能发现这些工作不像建立和部署模型那样令人有成就感(建立和部署模型阶段就开始看到了劳动的成果),但是忽视这些重要的准备工作是不明智的.任何学习算法的好坏取决于输入数据的好坏.

机器学习与R语言(原书第2版)》一1.4 实践中的机器学习

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第1章,第1.4节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 1.4 实践中的机器学习 到目前为止,我们已经讲述了理论上机器学习是如何工作的.为了把机器学习应用到真实世界的任务中,我们将采用由5个步骤构成的过程.不管你手头是何种任务,任何机器学习算法都能由下面这些步骤来实施:1)数据收集:数据收集步骤包括收集算法用来生成可行动知识的

《机器学习与R语言(原书第2版)》一2.2 用R管理数据

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第2章,第2.2节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 2.2 用R管理数据 当处理大量数据集时,面临的挑战包括收集.准备和管理来自各种不同来源的数据.尽管通过学习后面章节中的真实世界的机器学习任务,我们会深入地涉及数据准备.数据清理和数据管理,但本节重点讲述基本的R数据导入和导出功能. 2.2.1 保存.载入和移除R数据结构

《机器学习与R语言(原书第2版)》一 第1章 机器学习简介

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第1章,第1.1节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 第1章 机器学习简介 如果科幻故事是可信的,那么人工智能的发明将会不可避免地导致机器和其制造者之间的末日战争.在计算机使用的早期,计算机被教会玩井字棋和国际象棋这样一些简单的游戏.后来,机器被用来控制交通信号灯和通信,随后用来控制军用无人机和导弹.一旦计算机有感知力并且知

《机器学习与R语言(原书第2版)》一2.4 总结

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第2章,第2.4节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 2.4 总结 在本章中,我们学习了在R中管理数据的基础.从深入剖析用来存储不同类型数据的数据结构开始.R数据的基本结构是向量,它扩展和组合成更复杂的数据结构,比如,列表和数据框.数据框是与数据集概念相联系的R数据结构,数据框内同时有特征和案例.R提供了从电子表格类的数据文