Java 高质量编程建议(笔记5)

Ad-31:不要在接口中实现代码
    接口是一种框架协议,定义了各个功能模块之间的交互协议,因此不要把具体的功能实现放在接口中,避免接口中绑定了可变的实现部分,导致接口不稳定。
    接口是定义了要实现的类的功能接口,但是各个实现类之间不一般不存在耦合,如果实现放在接口中,就很容易导致接口实现类存在一定的耦合。
   
Ad-32:静态变量一定要先声明后赋值
    1)在大家的常识中,变量都是先声明后使用;
    2)Java中静态变量是类加载时被分配到数据区(Data Area),它在内存中只有一份拷贝,不会被分配多次, 其后所有的赋值操作都是值改变,地址保持不变;
    3)JVM初始化变量的时候是先声明空间,然后赋值;
    4)静态变量在类初始化时首次被加载,JVM会去查找类中所有的静态声明, 然后分配空间,注意这时候只是完成地址分配,还没有赋值, 之后JVM会根据类中静态赋值(包括静态类赋值和静态块赋值)的先后顺序进行赋值, 因此静态变量的初始化之后的值就是最后出现的值;
    5)鉴于上面的原因,静态变量一定要先声明后赋值,也就是说在编码的时候,最好将声明放在类定义的前面;
   
Ad-33:不要覆写静态方法  
    1)Java中可以通过覆写(Override)来增强或者减弱父类的的方法和行为,但是覆写针对的是非静态方法(也称为实例方法);
    2)一个实例对象有两个类型, 表面类型(Apparent Type)和实际类型(Actual Type),表面类型是对象声明的类型,实际类型就是产生对象是的类型,即new 的时候使用的类型,表面类型实际上是静态类型,而实际类型则是动态类型;
    3)静态方法是类级别的方法,是所有对象实例共有的,不依赖对象实例;
    4)访问静态方法通常是通过类名.方法名来访问的,Java也支持按照对象实例.方法名访问, 建议使用类名.方法的方式访问;
    5)Java编译的时候,对于静态方法在编译的时候就确定调用方法,也就是根据表面类型(静态类型)来确定静态方法的调用;
    6)在子类中构建与父类相同的方法名、输入参数、输出参数、访问权限(权限可以扩大)、并且父类和子类都是静态方法,此行为称:隐藏(Hide);
    7)覆写与隐藏表现形式不同,隐藏用于静态方法,覆写用与非静态方法,Override注解用于覆写,不能用于隐藏;
    8)覆写于隐藏的职责不同,隐藏的目的是为了抛弃父类静态方法,重现子类方法;覆写将父类的行为增强或减弱,延续了父类的职责;
   
Ad-34:构造函数尽量简化
Ad-35:避免在构造函数中初始化其他类
    1)构造函数在new的时候调用,构造函数的复杂影响创建对象的复杂程度,构造函数的复杂度也决定着初始化效率;
    2)构造函数尽可能不抛异常, 尽量不做复杂的算法等操作;
    3)构造函数尽量不处理IO等耗时较长的操作;
    4)构造函数中尽量不要初始化其他类对象,一定要避免构造函数的循环依赖,否则出现栈溢出;
    5)构造函数中不要处理倚赖子类的方法;
    
Ad-36:使用构造代码块精炼程序
Ad-37:构造代码块会想你所想
    1)代码块(Code Block): 是用大括号封装在一起的,形成一个独立的数据体,实现特定的算法的代码集合;
    2)代码块不能单独执行, 必须有其执行主体;
    3)代码块种类:
        3.1)普通代码块,在方法后面使用{}括起来的代码片段,通过方法名调用;
        3.2)静态代码块,在类中使用static修饰,并使用{} 括起来的代码片段,用于静态变量的初始化或对象创建前的环境初始化;
        3.3)同步代码块,使用synchronized关键字修改,并使用{}括起来的代码片段, 表示同一时间只能有一个线程进入该方法块;
        3.4)构造代码块,在类中没有任何的前缀或后缀,并使用{}括起来的代码片段;
    4)构造代码块在编译的时候,会插入到构造方法的前面,因此构造代码块的执行驱动是构造方法的调用者,即new 的时候;
    5)构造代码块的作用:
        5.1)初始化实例变量;避免在每个构造方法中都进行初始化,只需在构造代码块中做一次编码即可,减少重复代码,避免后续修改复杂;
        5.2)初始化实例环境:一个对象必须在适当的场景下存在,如果没有适当场景,则就需要创建对象所适应的场景;
        5.3)构造代码块可以有多个, 编码的时候,可以将不同业务逻辑的初始化放到不同的构造代码块中,编译的时候,会按照顺序插入到构造方法中;
    6)构造代码块会插入到每个构造方法中,在构造方法体的前面;
    7)如果构造方法中调用了其他构造方法,构造代码块会不会重复执行,编译的时候,构造方法中只要是用this,就不会插入构造代码块,只会将构造方法插入到没有构造方法前面;
    8)如果构造方法中调用了父类的构造方法,即通过super调用了父类构造方法,
       
       
Ad-38:使用静态内部类提高封装性
    1)Java支持类嵌套,也称内部类,即一个类中定义了另外一个类,Java嵌套类(Nested Class)分两种:静态内部类(使用static)和内部类;
    2)静态内部类的优点:加强类的封装性和提高了代码的可读性;
    3)静态内部类在编译时候,编译出来的文件名:外部类名+$+内部内名;
    4)静态内部类与普通内部类区别:
        4.1)静态内部类不持有外部类的引用,而普通内部类确持有外部类的引用,这样就可以访问外部内的属性、方法,包括私有的,静态内部类只能访问外部类的静态成员;
        4.2)静态内部类不依赖外部类;普通内部类与外部类之间互相依赖,内部类的实例不能脱离外部类的实例,它们的生命周期相同;
        4.3)普通内部类不能声明static方法和变量;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值