本周重点介绍了mutable和immutable的概念,有些抽象。对于immutable的数据类型来说,想修改其引用指向的值,必须使其指向新的内存区域,而不能在原有的内存区域做修改。mutable数据类型相反,可以在原来指向的内存区域进行修改。设计ADT时,尽量将小的数据型的ADT设置为immutable,提高程序健壮性。

静态/动态类型检查

1.数据类型:基本数据类型和对象数据类型的对比。

2.对象类型具有层次结构,除了Object类之外的所有类都有父类。Object是所有类的父类。Java中只支持单继承。
3.静态检查:在不运行程序的前提下的检测。Java是一种静态类型语言,所有变量的种类在编译阶段已经明确。在Eclipse中,静态检测在写代码的时候就已经进行,在不合法的位置会用标记指明。静态类型检查可以在编译阶段发现错误,避免将错误带入运行阶段,可以提高程序的正确性和健壮性。
静态检查可以发现的错误:语法错误、函数名/类名错误、参数数目错误、参数类型错误、返回值类型错误等。

4.动态检查:像Python一类的动态类型语言,在程序运行阶段才进行类型检查。动态类型检查>>静态类型检查>>无检查,因为动态类型检查可以针对具体的值进行检查(比如除数为0的问题)。静态检查是关于“类型”的检查,不考虑值;动态类型检查是关于“值”的检查。
动态检查可以发现的错误:非法参数值、非法返回值、越界、使用空指针等。

可变/不可变数据类型

1.改变一个变量:将该变量指向另一个值的存储空间。
改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新的值。
2.final限定变量的指向是不可改变的。如果编译器不能确定final变量不会改变,就会提示错误,也是静态类型检查的一部分。
final类无法派生子类;final变量无法改变值和引用;final方法无法被子类重写。
3.不变对象:一旦被创建,始终指向同一个值/引用。
可变对象:拥有方法可以修改自身的值/引用。
String类是不可变类的一种。如果要改变一个String对象,则需要将引用修改后的存储空间。

StringBuilder是一种可变类。如果改变一个StringBuilder对象,则对原本存储区域的内容修改即可。

4.当一个值只有一个引用时,可变与不可变没有区别。当有多个引用时会有很大区别。

5.使用不可变类型时,对其频繁的修改会产生大量的临时拷贝(需要被回收);可变类型最小化拷贝,提高了效率。不可变类型使用时更加安全,在其它质量指标上的表现更好。使用时需要权衡折中。
6.可以通过防御式拷贝(比如返回一个新的对象)来修正可变类型造成的bug。但是大部分时候拷贝不会被客户端修改,会造成大量的内存浪费。如果使用不可变类型,就节省了频繁复制的代价,不可变可以比可变的效率更高,因为不可变从不做防御式拷贝。
7.将可变转换成不可变:
使用传入的引用->利用传入引用建立新的对象再使用(在方法中使用复制对象)
返回引用->返回新的对象(即返回一份复制)

Snapshot

1.属于三维视图的Run-time、Moment、Code层面,用于描述程序运行时的内部状态。便于交流和理解设计思路。
2.基本类型的值和对象类型的值在SnapshotDiagram中的表示

对象存储在堆中,用椭圆形状标明。基本数据类型和对象的引用存储在栈中。基本数据类型的标识符不会存放在栈中。
对于不可变对象,用双线椭圆。
String s = “a”;
s = s + “b”;

3.final限定引用(!!!)不可改变。引用不可变,但是引用指向的存储区域的值是可以改变的。对于不可变引用,用双线。可变的引用,也可以指向不可变的值。
例如:新建一个final的List称为a,可以使用add向a中添加值,但是不能让a指向另一个List。

可变类型 List Set Map

参考https://www.cnblogs.com/jxxblogs/p/11561629.html
1.List
大小可变(数组不可变)。
可以通过位置存储、访问数据。
List是接口,且成员必须是对象。
2.Set
Set是零或多个对象组成的无序集合,不允许元素重复。
Set是接口,成员是对象。
3.Map
和Python中的Dictionary类似,是由二元组(key-value)构成的。
不允许key值重复。
Map是接口。

迭代器 Iteration

1.主要用途是对集合进行遍历。iteraror有两个方法:next()返回集合中的下个元素,hasNext()测试迭代器是否达到集合末尾元素。

2.如果要遍历集合并删除指定元素的话,必须使用迭代器。
错误示范:

正确示范:

不可变类型

1.基本类型及其封装对象类型都是不可变的。
2.使用Collections.unmodifiableList、Collections.unmodifiableSet、Collections.unmodifiableMap方法将List、Set、Map包装成不可变类型。但是这种不可变是在运行阶段获得的,在编译阶段无法据此进行静态检查。即如果在编译阶段尝试修改包装类属性,编译器不会报错。

有关规约书写

1.规约是程序和客户端之间达成的一致。只讲“能做什么”,不讲“怎么实现”。规约不只是注释,还包括返回值、参数、方法名。

2.规约不包括方法具体实现的内容。规约中的方法都是public方法。代码中蕴含的设计决策针对编译器,而规约(注释)的设计决策针对读者。
3.行为等价性从用户视角出发,根据规约判断行为是否等价。如果两个函数符合同一规约,则它们等价。
4.前置条件:对客户端的约束,即在使用方法时必须满足的条件。
后置条件:对开发者的约束,方法结束时必须满足的条件。
如果前置条件满足,后置条件必须满足。前置条件不满足,方法可做任何事。
5.用@param规范化前置条件,用@return和@throws规范后置条件。

6.如果改变了输入数据(mutating methods),要在规约中明确指出。除非规约要求,否则不应修改输入参数。

软件构造学习笔记-第四周相关推荐

  1. 软件构造学习笔记-第八周

    本周重点是Liskov可替换原则.它要求父类和子类的行为一致性,子类要有更强的不变量.更弱的前置条件.更强的后置条件.在该原则的要求下,每个子类都可以对父类进行替换.这在开发过程中会带来极大的便利,在 ...

  2. 软件构造学习笔记(九)面向复用的软件构造技术

    目录链接 Part I What is Software Reuse? Part II How to measure "reusability"? Part III Levels ...

  3. 软件构造学习笔记ATD

    在面向对象的编程中,ADT的编写十分重要,与传统的c语言不同,面向对象的编程更加商业化一点,所以保密需要做好,有点商业机密的感觉.如何设计良好的抽象数据结构,通过封装来避免客户端获取数据的内部表示,避 ...

  4. 哈工大软件构造学习笔记1 Views and Quality Objectives of Software Construction

    先要搞清楚软件构造的对象是什么,如何刻画,在关注如何构造. 1,Five key quality objectives of software construction 软件构造的五个关键质量目标 容 ...

  5. 软件构造学习笔记-第九周、第十周

    因为本周五开始五一假期,所以只有一节软件构造课.因为内容还属于创建模式.结构模式.行为模式.将该堂课的内容整合到本博客中.本周的重点是程序开发模式,在写代码之前首先充分考虑采用哪种模式更有利于开发.维 ...

  6. 哈工大2022春软件构造学习笔记1

    课程概述 第一部分:软件构造基础 第二部分:ADT+OOP 第三部分:面向可复用性和可维护性的软件构造 第四部分:面向健壮性与正确性的软件构造 第一章 软件构造的多维度视图和质量目标 软件构造的多维度 ...

  7. 软件构造学习笔记-第十四周、十五周

    课程进入了尾声.本周内容主要是线程安全相关.线程错误比一般的错误更加难以发现和修改,甚至加入一条print语句就能改变时间分片,从而导致错误消失.重点介绍了"锁"的机制,在使用时避 ...

  8. 软件构造学习笔记(六)抽象数据类型

    目录链接 Part I Abstraction and User-Defined Types Part II Classifying Types and Operations Part III Abs ...

  9. 软件构造学习笔记-实验3

    本次实验要求从五项要求(航班管理.高铁车次管理.操作系统进程管理.大学课表管理.学习日程管理)里完成三项要求,并且尽量实现复用. 面向可复用性和可维护性的设计:PlanningEntry 1.首先设计 ...

最新文章

  1. 博客园模板 样式优化
  2. RMQ问题(线段树算法,ST算法优化)
  3. 商汤组了「最强大脑」局,正儿八经解释为啥搞起电竞AI
  4. Interview:算法岗位面试—10.24下午—上海某软件公司(机器学习,上市)电话面试—考察SVM、逻辑回归、降低过拟合、卷积网络基础等
  5. stm32 GPIO模式
  6. 机器学习---knn之价格预测
  7. 2000年考研英语阅读理解文章五
  8. java子类继承父类实际_java子类继承父类,是否生成父类对象?
  9. Facebook与MySpace实现即时通讯一体化
  10. python怎么创建变量_Python之变量的创建过程
  11. 测试负责人和测试工程师在日常工作有什么不同
  12. 双A复制mysql_mysql双主复制并利用keepalived做高可用
  13. UDP socket查询高速缓存
  14. 怎么用dos系统进入服务器,怎么用DOS命令方式启动系统服务
  15. 谷歌地球尝试验证时检测到错误_验证码为何越来越难了?
  16. CCF所有领域best paper合集!发顶会论文必看!中国计算机学会推荐会议的Best paper~
  17. .prevent 与 .stop,以及解决其他地方长按,文本被选中的问题
  18. UFS和EMMC的区别--原理学习
  19. android自动切换暗色,根据环境光亮度自动切换,让 Android 10 的暗色主题更智能:Auto Dark Theme...
  20. Excel批量更改图片名称(无需下载其他工具)

热门文章

  1. php symfony urlmatcher-gt;match,symfony路由组件(The Routing Component)
  2. 在anaconda中运行jupyter notebook,无法自动打开浏览器的解决方案,亲测100%有效
  3. [转]ES6、ES7、ES8、ES9、ES10新特性一览 (个人整理,学习笔记)
  4. C#访问postgresql数据库类MyPostDB的实现
  5. DateTime.Now.Ticks.ToString()说明
  6. Kotlin之?和!!最简单的理解
  7. IOS之学习笔记十四(协议的定义和实现)
  8. Andorid之Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)的用法总结
  9. Java - 强引用、弱引用、软引用、虚引用
  10. Android之集成友盟推送功能