【软件构造】数据类型和类型检验

Java的数据类型

  Java数据类型可分为两类:基本数据类型和对象(引用)数据类型
image

动态/静态数据类型检验

  动态/静态指程序是否运行。静态类型检验在运行程序前进行,而动态类型检验在程序运行时进行。
  两类类型检验主要包含以下错误:

  • 静态
    • 语法错误
    • 类名/函数名错误
    • 参数数目错误
    • 参数类型错误
    • 返回值类型错误
  • 动态
    • 非法参数值
    • 非法返回值
    • 越界
    • 空指针

  静态检查因为没有运行程序,无法获得变量具体的值,关注的是类型是否符合要求;而动态检验则会关注值的检查。

可变类型与不可变类型

  变量是否是可变类型取决于是否使用final和是否是引用数据类型。
  变量储存值。对于基本数据类型,变量储存的是值本身;而对于引用类型,变量储存的是指向对象的地址,或者说这些变量和基本数据类型变量一样储存值,只是储存的值是对象的地址。final修饰成员变量时,成员变量不能在声明之后重新赋值,那么对于值类型来说就是不能修改值,对于引用类型来说就是不能指向其他对象;但是我们仍可以通过调用指向对象的能修改自身的方法来修改对象储存的数据。
  我们继续将对象地址看作引用类型的“值”,发现其和值类型对象一样,作为返回值时不会有被修改的风险。如果直接返回成员变量指向的对象可能会导致对象被外部意外修改,但是成员变量指向哪个对象(即储存的对象地址)是绝不会因为这件事而被改变的。
  可以用下图表示两种类型的关系:
image

  故要让一个引用类型成为不可变类型,就要保证这个类型的对象在创建后不能通过任何方法修改内部的数据。这样要修改变量指向的对象时,就必须创建新的对象来替代旧对象。
  但是使用不可变类型,每次修改值都要创建新的对象,在需要频繁修改对象的情况下会严重影响性能。如果要在防止对象被意外修改的同时提升性能,可以在给外部提供对象时进行防御性拷贝,即返回原对象的副本。这样调用者就可以在不创建新对象就能够修改获取的值,同时又不会影响来源对象的值。

  总体来说,不可变类型更安全且在不会要频繁获取的情况下性能更好,可变类型更灵活且在需要频繁修改的情况下有更好的性能表现。使用哪种类型要视情况而定。

Snapshot diagram

  用于描述程序运行时的内部状态,让设计思路更清晰,便于开发者之间的交流理解

  1. 对于基本类型变量,使用单箭头指向值的形式,不注明类型
    image

  2. 对于可变引用类型变量,用单线椭圆包围类型和成员变量,从椭圆内部拉线出来从各成员变量指向对应值
    image

  3. 对于不可变引用类型变量,使用双线椭圆包围类型和值
    image

  4. 对于不可变引用(final标记的变量),使用双线箭头指向值;可变引用则单向
    image

posted @ 2023-04-10 18:54  NoSLoofah  阅读(12)  评论(0)    收藏  举报