1700441280
1700441281
public Client(){
1700441282
1700441283
System.out.println(“执行构造代码块”);
1700441284
1700441285
System.out.println(“执行无参构造”);
1700441286
1700441287
}
1700441288
1700441289
public Client(String_str){
1700441290
1700441291
System.out.println(“执行构造代码块”);
1700441292
1700441293
System.out.println(“执行有参构造”);
1700441294
1700441295
}
1700441296
1700441297
}
1700441298
1700441299
每个构造函数的最前端都被插入了构造代码块,很显然,在通过new关键字生成一个实例时会先执行构造代码块,然后再执行其他代码,也就是说:构造代码块会在每个构造函数内首先执行(需要注意的是:构造代码块不是在构造函数之前运行的,它依托于构造函数的执行),明白了这一点,我们就可以把构造代码块应用到如下场景中:
1700441300
1700441301
(1)初始化实例变量(Instance Variable)
1700441302
1700441303
如果每个构造函数都要初始化变量,可以通过构造代码块来实现。当然也可以通过定义一个方法,然后在每个构造函数中调用该方法来实现,没错,可以解决,但是要在每个构造函数中都调用该方法,而这就是其缺点,若采用构造代码块的方式则不用定义和调用,会直接由编译器写入到每个构造函数中,这才是解决此类问题的绝佳方式。
1700441304
1700441305
(2)初始化实例环境
1700441306
1700441307
一个对象必须在适当的场景下才能存在,如果没有适当的场景,则就需要在创建对象时创建此场景,例如在JEE开发中,要产生HTTP Request必须首先建立HTTP Session,在创建HTTP Request时就可以通过构造代码块来检查HTTP Session是否已经存在,不存在则创建之。
1700441308
1700441309
以上两个场景利用了构造代码块的两个特性:在每个构造函数中都运行和在构造函数中它会首先运行。很好地利用构造代码块的这两个特性不仅可以减少代码量,还可以让程序更容易阅读,特别是当所有的构造函数都要实现逻辑,而且这部分逻辑又很复杂时,这时就可以通过编写多个构造代码块来实现。每个代码块完成不同的业务逻辑(当然了,构造函数尽量简单,这是基本原则),按照业务顺序依次存放,这样在创建实例对象时JVM也就会按照顺序依次执行,实现复杂对象的模块化创建。
1700441310
1700441311
1700441312
1700441313
1700441315
编写高质量代码:改善Java程序的151个建议 建议37:构造代码块会想你所想
1700441316
1700441317
上一个建议中我们提议使用构造代码块来简化代码,并且也了解到编译器会自动把构造代码块插入到各个构造函数中,那我们接下来看看编译器是不是足够聪明,能够为我们解决真实的开发问题。有这样一个案例:统计一个类的实例数量。可能你要说了,这很简单,在每个构造函数中加入一个对象计数器不就解决问题了吗?或者使用我们上一个建议介绍的,使用构造代码块也可以。确实如此,我们来看如下代码是否可行:
1700441318
1700441319
public class Client{
1700441320
1700441321
public static void main(String[]args){
1700441322
1700441323
new Base();
1700441324
1700441325
new Base(””);
1700441326
1700441327
new Base(0);
1700441328
1700441329
System.out.println(“实例对象数量:”+Base.getNumOfObjects());
[
上一页 ]
[ :1.70044128e+09 ]
[
下一页 ]