[改善Java代码]避免在构造函数中初始化其他类
2016-04-22 20:55
267 查看
建议35: 避免在构造函数中初始化其他类
构造函数是一个类初始化必须执行的代码,它决定着类的初始化效率,如果构造函数比较复杂,而且还关联了其他类,则可能产生意想不到的问题,我们来看如下代码:
这段代码并不复杂,只是在构造函数中初始化了其他类,想想看这段代码的运行结果是什么?是打印“Hi,show me something”吗?
答案是这段代码不能运行,报StackOverflowError异常,栈(Stack)内存溢出。这是因为声明s变量时,调用了Son的无参构造函数,JVM又默认调用了父类Father的无参构造函数,接着Father类又初始化了Other类,而Other类又调用了Son类,于是一个死循环就诞生了,直到栈内存被消耗完毕为止。
可能有读者会觉得这样的场景不可能在开发中出现,那我们来思考这样的场景:Father是由框架提供的,Son类是我们自己编写的扩展代码,而Other类则是框架要求的拦截类(Interceptor类或者Handle类或者Hook方法),再来看看该问题,这种场景不可能出现吗?
那有读者可能要说了,这种问题只要系统一运行就会发现,不可能对项目产生影响。
那是因为我们在这里展示的代码比较简单,很容易一眼洞穿,一个项目中的构造函数可不止一两个,类之间的关系也不会这么简单的,要想瞥一眼就能明白是否有缺陷这对所有人员来说都是不可能完成的任务,解决此类问题的最好办法就是:不要在构造函数中声明初始化其他类,养成良好的习惯。
构造函数是一个类初始化必须执行的代码,它决定着类的初始化效率,如果构造函数比较复杂,而且还关联了其他类,则可能产生意想不到的问题,我们来看如下代码:
public class Client { public static void main(String[] args) { Son s = new Son(); s.doSomething(); } } // 父类 class Father { Father() { new Other(); } }// 子类 class Son extends Father { public void doSomething() { System.out.println("Hi,show me something"); } } // 相关类 class Other { public Other() { new Son(); } }
这段代码并不复杂,只是在构造函数中初始化了其他类,想想看这段代码的运行结果是什么?是打印“Hi,show me something”吗?
答案是这段代码不能运行,报StackOverflowError异常,栈(Stack)内存溢出。这是因为声明s变量时,调用了Son的无参构造函数,JVM又默认调用了父类Father的无参构造函数,接着Father类又初始化了Other类,而Other类又调用了Son类,于是一个死循环就诞生了,直到栈内存被消耗完毕为止。
可能有读者会觉得这样的场景不可能在开发中出现,那我们来思考这样的场景:Father是由框架提供的,Son类是我们自己编写的扩展代码,而Other类则是框架要求的拦截类(Interceptor类或者Handle类或者Hook方法),再来看看该问题,这种场景不可能出现吗?
那有读者可能要说了,这种问题只要系统一运行就会发现,不可能对项目产生影响。
那是因为我们在这里展示的代码比较简单,很容易一眼洞穿,一个项目中的构造函数可不止一两个,类之间的关系也不会这么简单的,要想瞥一眼就能明白是否有缺陷这对所有人员来说都是不可能完成的任务,解决此类问题的最好办法就是:不要在构造函数中声明初始化其他类,养成良好的习惯。
相关文章推荐
- springMVC利用FastJson接口返回json数据相关配置
- java---获取当前系统时间--纳秒
- java 继承与多态
- [改善Java代码]构造代码块会想你所想
- Spark使用小结:Java版的GroupByKey示例
- [改善Java代码]使用构造块精炼程序
- Spring 和Axis2整合相关那些事
- Java多线程
- java去除重复对象
- Spring IOC 源码浅析
- SpringMVC学习记录(八)--开发中的小问题
- 重读《Java编程思想(第四版)》(10-17章、18章部分)
- java中equals的用法以及与==的区别
- java基础(14)-- Java NIO
- [Java基础]一个语句交换两个数的值
- Spring MVC上传文件
- Java中子类继承了父类的私有属性及方法吗?
- poj 3070 java实现矩阵快速幂
- 【Leetcode】:318. Maximum Product of Word Lengths 问题 in JAVA
- eclipse发布web项目时提示无法找到外部包的类