java对象循环依赖问题

时间:2021-12-15 20:29:52

假设我们有一个类A,它包含了一个B的对象,同时类B也包含了一个A对象。那么此时不管你实例化哪一个类,都会出现*Error错误,这就是java对象循环依赖问题。类似于鸡和蛋的问题。

首先我们看下面这段错误的代码,分析其错误的地方。

[java] view plain copy print?
  1. public class CyclicDependencies {  
  2.     public static void main(String args[]){  
  3.         Chicken c = new Chicken() ;  
  4.         //Egg e = new Egg() ;  
  5.     }  
  6. }  
  7.   
  8. class Chicken{  
  9.     private Egg e ;  
  10.     private int age ;  
  11.     public Chicken(){  
  12.         e = new Egg() ;  
  13.         setAge(10) ;  
  14.     }  
  15.     public int getAge() {  
  16.         return age;  
  17.     }  
  18.     public void setAge(int age) {  
  19.         this.age = age;  
  20.     }  
  21.   
  22. }  
  23. class Egg{  
  24.     private Chicken chicken ;  
  25.     private int weight ;  
  26.     public Egg(){  
  27.         chicken = new Chicken() ;  
  28.         setWeight(1) ;  
  29.     }  
  30.     public int getWeight() {  
  31.         return weight;  
  32.     }  
  33.     public void setWeight(int weight) {  
  34.         this.weight = weight;  
  35.     }  
  36. }  


Exception in thread "main" java.lang.*Error

这是上面代码报的错误,因为当你创建一个Chicken对象时,同时也需要一个Egg对象,而一个Egg对象也需要一个Chicken对象,这样一直循环下去就发生了栈溢出的错误。

那么如何来解决这个问题呢?我们可以给Chicken写一个代理类ChickenProxy,这样Egg包含的不再是Chicken而是代理类ChickenProxy,这样就利用了第三方来解决循环依赖问题。代码如下。

[java] view plain copy print?
  1. public class CyclicDependencies {  
  2.     public static void main(String args[]){  
  3.         Chicken c = new Chicken() ;  
  4.         Egg e = new Egg(c) ;  
  5.   
  6.         System.out.println(c.getAge());  
  7.         System.out.println(e.getWeight());  
  8.     }  
  9. }  
  10.   
  11. interface ChickenProxy{  
  12.     int getAge();  
  13.     void setAge(int age) ;  
  14. }  
  15.   
  16. class Chicken implements ChickenProxy{  
  17.     private Egg e ;  
  18.     private int age ;  
  19.     public Chicken(){  
  20.         e = new Egg(this) ;  
  21.         setAge(10) ;  
  22.     }  
  23.     public int getAge() {  
  24.         return age;  
  25.     }  
  26.     public void setAge(int age) {  
  27.         this.age = age;  
  28.     }  
  29.   
  30. }  
  31. class Egg{  
  32.     private ChickenProxy chicken ;  
  33.     private int weight ;  
  34.     public Egg(Chicken c){  
  35.         chicken = c ;  
  36.         setWeight(1) ;  
  37.     }  
  38.     public int getWeight() {  
  39.         return weight;  
  40.     }  
  41.     public void setWeight(int weight) {  
  42.         this.weight = weight;  
  43.     }  
  44. }  



2014-11-13 15:41:41

Brave,Happy,Thanksgiving !