2016-02-01 141 views
0

下面我發佈了一個帶有循環依賴關係的簡單Java代碼示例。解決循環依賴問題Java

MyObject有兩個成員(myObject1myObject2),它們具有對象本身的引用。

有沒有辦法解決依賴關係,但保持功能?

public abstract class AbstractMyObject { 

    public void myMethod(int param) { 
     System.out.println(param); 
    } 
} 

public class MyObject extends AbstractMyObject { 

    private MyObject1 myObject1; 
    private MyObject2 myObject2; 

    public MyObject() { 
     myObject1 = new MyObject1(this); 
     myObject2 = new MyObject2(this); 
     ... 
    } 

    private void aMethod() { 
     myObject1.doSomething(); 
     myObject2.doSomething(); 
    } 
} 

public class MyObjectWrapper { 
    private MyObject myObject; 

    public MyObjectWrapper (MyObject myObject) { 
     this.myObject = myObject; 
    } 

    public void myMethod(int param) { 
    this.myObject.myMethod(param); 
    } 
} 

public class MyObject1 extends MyObjectWrapper { 

    public MyObject1(MyObject myObject) { 
    super(myObject); 
    } 

    private void aMethod() { 
    myMethod(1); 
    } 

    public void doSomething() { 
    ... 
    } 
} 

public class MyObject2 extends MyObjectWrapper { 

    public MyObject2(MyObject myObject) { 
    super(myObject); 
    } 

    private void aMethod() { 
    myMethod(2); 
    } 

    public void doSomething() { 
    ... 
    } 
} 
+0

這是真正的Java?檢查你的構造函數! –

+0

你想保留什麼功能? – weston

回答

1

申報接口:

public interface class MyInterface {  
    void myMethod(int param); 
} 

實現接口:

public class MyObject implements MyInterface { 

使用的界面,在包裝和後代,而不是具體類MyObject

public class MyObjectWrapper { 
    private MyInterface myObject; 

    public MyObjectWrapper (MyInterface myObject) { 
     this.myObject = myObject; 
    } 

    public myMethod(int param) { 
    this.myObject.myMethod(param); 
    } 
} 
+0

但是這只是一種更抽象或?最簡單的解決方案可能是將所有的代碼都放在一個類中,但是這使得這個類非常龐大。那麼佈置代碼的最佳方式是什麼? – tellob

+2

這只是一種方法來阻止A類引用B類和B類引用A類。除此之外,我不知道什麼是最適合你的,我看不到你想要達到的目標。 – weston