1700441266
1700441267
}
1700441268
1700441269
public Client(String_str){
1700441270
1700441271
System.out.println(“执行有参构造”);
1700441272
1700441273
}
1700441274
1700441275
}
1700441276
1700441277
这是一段非常简单的代码,它包含了构造代码块、无参构造、有参构造,我们知道代码块不具有独立执行的能力,那么编译器是如何处理构造代码块呢?很简单,编译器会把构造代码块插入到每个构造函数的最前端,上面的代码与如下代码等价:
1700441278
1700441279
public class Client{
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:构造代码块会想你所想
[
上一页 ]
[ :1.700441266e+09 ]
[
下一页 ]