济南想做网站,网站后台 清理缓存,南宁百姓网官网,海口网站开发建设本周重点介绍了mutable和immutable的概念#xff0c;有些抽象。对于immutable的数据类型来说#xff0c;想修改其引用指向的值#xff0c;必须使其指向新的内存区域#xff0c;而不能在原有的内存区域做修改。mutable数据类型相反#xff0c;可以在原来指向的内存区域进行…本周重点介绍了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要在规约中明确指出。除非规约要求否则不应修改输入参数。