避免在构造函数中初始化其他类

简介:

构造函数是一个类初始化必须执行的代码,它决定着类的初始化效率,如果构造函数比较复杂,而且还关联了其他类,则可能产生意想不到的问题,我们来看如下代码:

复制代码
 1 public class Client {
 2     public static void main(String[] args) {
 3         Son s = new Son();
 4         s.doSomething();
 5     }
 6 }
 7 
 8 // 父类
 9 class Father {
10     Father() {
11         new Other();
12     }
13 }// 子类
14 
15 class Son extends Father {
16     public void doSomething() {
17         System.out.println("Hi,show me something");
18     }
19 }
20 
21 // 相关类
22 class Other {
23     public Other() {
24         new Son();
25     }
26 }
复制代码

这段代码并不复杂,只是在构造函数中初始化了其他类,想想看这段代码的运行结果是什么?是打印“Hi,show me something”吗?

答案是这段代码不能运行,报StackOverflowError异常,栈(Stack)内存溢出。这是因为声明s变量时,调用了Son的无参构造函数,JVM又默认调用了父类Father的无参构造函数,接着Father类又初始化了Other类,而Other类又调用了Son类,于是一个死循环就诞生了,直到栈内存被消耗完毕为止。

可能有读者会觉得这样的场景不可能在开发中出现,那我们来思考这样的场景:Father是由框架提供的,Son类是我们自己编写的扩展代码,而Other类则是框架要求的拦截类(Interceptor类或者Handle类或者Hook方法),再来看看该问题,这种场景不可能出现吗?

那有读者可能要说了,这种问题只要系统一运行就会发现,不可能对项目产生影响。

那是因为我们在这里展示的代码比较简单,很容易一眼洞穿,一个项目中的构造函数可不止一两个,类之间的关系也不会这么简单的,要想瞥一眼就能明白是否有缺陷这对所有人员来说都是不可能完成的任务,解决此类问题的最好办法就是:不要在构造函数中声明初始化其他类,养成良好的习惯。

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5422722.html,如需转载请自行联系原作者

相关文章
|
1月前
|
C++
C++构造函数初始化类对象
C++构造函数初始化类对象
17 0
|
6月前
|
存储 编译器 C语言
声明,定义,初始化,实例化
声明,定义,初始化,实例化
94 0
C#中声明、初始化和实例化
C#中声明、初始化和实例化
100 0
|
6月前
|
编译器 C++
30利用构造函数对类对象进行初始化
30利用构造函数对类对象进行初始化
47 0
|
6月前
|
C语言
C11中类成员变量定义时初始化问题
C11中类成员变量定义时初始化问题
69 0
通过构造方法使属性初始化
通过构造方法使属性初始化
106 0
|
安全 编译器 C++
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(二)
朋友们好啊,今天终于更新了。我是柠檬叶子C,本章将继续讲解C++中的面向对象的知识点,本篇主要讲解默认成员函数中的构造函数、析构函数和拷贝构造函数。还是和以前一样,我们将由浅入深地去讲解,以 "初学者" 的角度去探索式地学习。会一步步地推进讲解,而不是直接把枯燥的知识点倒出来,应该会有不错的阅读体验。如果觉得不错,可以 "一键三连" 支持一下博主!你们的关注就是我更新的最大动力!Thanks ♪ (・ω・)ノ
97 0
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(二)
|
编译器 C++
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(一)
朋友们好啊,今天终于更新了。我是柠檬叶子C,本章将继续讲解C++中的面向对象的知识点,本篇主要讲解默认成员函数中的构造函数、析构函数和拷贝构造函数。还是和以前一样,我们将由浅入深地去讲解,以 "初学者" 的角度去探索式地学习。会一步步地推进讲解,而不是直接把枯燥的知识点倒出来,应该会有不错的阅读体验。如果觉得不错,可以 "一键三连" 支持一下博主!你们的关注就是我更新的最大动力!Thanks ♪ (・ω・)ノ
133 0
【C++要笑着学】类的默认成员函数详解 | 构造函数 | 析构函数 | 构造拷贝函数(一)
|
Java 测试技术
成员变量初始化的问题
成员变量初始化的问题
学生类-构造函数
学生类-构造函数
179 0