《代码大全2》第三章 变量(使用变量的一般事项)

开始之前,先按照图中内容做一个测试,这个测试是书中提供的数据认知测试,因为我自己做过,所以我把我做的都消除了。
数据认知测试
根据图中的提示,计算自己的总分,在文章最后有得分评价。

接下来我们进入主题:变量
这一章有四个部分:

  • 使用变量的一般事项
  • 变量名的力量
  • 基本数据类型
  • 不常见的数据类型

这一篇只记录第一部分 使用变量的一般事项

使用变量的一般事项

变量初始化原则

不合理地初始化数据是产生编程错误的常见根源之一。
高级编程语言对基本数据类型都是有默认值的,所以很多情况哪怕不初始化也不会出问题,前提是你要完全知晓其默认值是什么,虽然在编程中是允许先声明变量,再初始化变量,但通常程序员在声明变量的同时就会对其进行初始化,现在的idea也会提醒程序员存在变量未初始化,或许因为成为了习惯,很多人甚至都没有去想过为什么声明就要初始化。

public class SumArray {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};
        int sum; // 声明变量但未初始化

        // 计算数组的总和
        for (int number : numbers) {
            sum += number; // 尝试使用未初始化的变量
        }

        // 打印总和
        System.out.println("The sum of the array is: " + sum);
    }
}

在这个java 例子中,变量 sum 被声明为一个 int 类型,但没有被初始化。当我们尝试在 for 循环中累加 sum 的值时,由于 sum 未初始化,编译器会报错。

尝试编译和运行这段代码时,会看到类似以下的错误信息:

SumArray.java:8: error: variable sum might not have been initialized
            sum += number;
            ^
1 error

为什么int sum没有默认值0呢?因为在java中局部变量是没有默认值的,所以在方法中声明的变量不会具有默认值,需要自己进行初始化,只有实例变量和类变量才会有默认值。Java不为局部变量提供默认值,是为了提高代码的安全性、可靠性、可读性和可维护性。通过强制初始化变量,Java减少了程序中的潜在错误,使开发人员编写出更清晰、更健壮的代码。(因为习惯,可能很多人也不知道为什么吧?)

下面是一些避免产生初始化错误的建议:

  1. 在声明变量的时候初始化
  2. 在靠近变量第一次使用的地方初始化它
  3. 理想情况下,在靠近第一次使用变量的位置声明和定义该变量
  4. 在可能的情况下使用final或者const(这是为了放在变量初始化后再次被赋值,也就是常量了)
  5. 特别注意计数器和累加器(主要是注意这种类型的变量在使用之前要记住重置值为初始化值)
  6. 在类的构造函数中初始化该类的数据成员
  7. 检查是否需要重新初始化(这一条对应的场景例子就是第五条)
  8. 一次性初始化具名常量;用可执行代码来初始化变量
  9. 使用编译器设置来自动初始化所有变量(如果你的编译器支持自动初始化的话就把它打开吧)
  10. 利用编译器的警告信息(现在的idea都有这个警告提示的)
  11. 检查输入参数的合法性
  12. 使用内存访问检查工具来检查错误指针
  13. 在程序开始时初始化工作内存
作用域

作用域也叫可见性,是指变量在程序内的可见范围和可应用范围。
变量的作用域应该做到如下几点:
14. 是变量引用局部化(把引用点尽可能的集中在一起)
15. 尽可能缩短变量的“存活”时间(长存活时间意味着一个经历了许多语句,短存活时间意味着只经历了很少的语句)

减小作用域的一般原则

  1. 在循环开始之前再去初始化该循环里使用的变量,而不是在该循环所属的子程序的开始处初始化这些变量
  2. 直到变量即将被使用再为其赋值
  3. 把相关语句放在一起
  4. 把相关语句组提取成单独的子程序
  5. 开始时采用最严格的可见性,然后根据需要扩展变量的作用域
绑定时间

把变量和它的值绑在一起的时间叫做绑定时间。一般而言,绑定时间越早灵活性就会越差,单复杂度也会越低。视乎这个大多数程序员并不会关注这个绑定时间的问题。什么是早绑定,什么是晚绑定呢?变量初始化是一个具体的值,这就是早绑定,直观明了,复杂度低,但灵活性低;变量的初始化结果等于一个函数的调用结果,这就是晚绑定,因为这个变量的值是需要等待函数调用后才有的,并且这时候变量的值具体是多少,取决于函数的实现,这也就是灵活性,不需要修改初始化,修改函数实现就可以了,但也增加了复杂度,因为你需要关注函数的实现才能知道变量的初始化值是多少。

为变量指定单一用途

java中,变量都是需要指定类型的,这个类型实际就已经限定了用途的范围了,但是在JavaScript中,变量是不需要确定类型的,这个变量可能开始是一个对象类型,后面就变成number类型了,如果出现这种情况,命名再模糊一些,编码在不规范一些,这样的代码简直是噩梦。

使用变量的一般事项要点
  • 要避免因为数据初始化问题导致的出错问题
  • 最小化每个变量的作用域。把同一变量的引用点集中在一起。把变量限定再子程序或类的范围之类。避免使用全局数据(注意是避免、避免、避免)。
  • 把使用相同变量的语句尽可能的集中在一起
  • 早期绑定会减低灵活性,但有助于减少复杂度。晚期绑定可以增加灵活度,同时增加复杂度
  • 把每个变量用于唯一的用途

在这里插入图片描述

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值