2010-10-11 53 views
1

我有一個類說'A',其中一個對象'a'創建一個類'B'的對象'b'。現在'b'運行一個方法,它想創建一個b的父對象的新實例(請不要將它與繼承混淆) - 創建'b'的類,這裏是'A'。在java中,如何調用當前類的實例創建者的構造函數?

這是否可以在Java中使用?或者,也許一些設計建議可能會起作用。

謝謝!

編輯:根據建議,我也添加了我的設計要求。我有一個「ExitController」類,它根據調用者函數的不同作用 - 就像它由UserX調用,它終止程序,如果它由UserY調用,它將他註銷,等等。 通常我應該放置我的用戶界面中有一個ExitController方法,但有一些限制,我不能。而且,傳遞父對象/類名似乎與其提供的使用相比非常昂貴。

+0

這聽起來很奇怪,也許你應該重新考慮你的設計。也許你需要一個工廠類。 – starblue 2010-10-11 18:58:45

+1

如果我們真的知道問題出在哪裏,那麼設計建議可能是一個非常好的主意。這聽起來像是某種部分解決方案,但不清楚你想要解決什麼問題。 – 2010-10-11 19:00:07

+0

@dobroby是對的。將來,嘗試闡述功能需求本身,而不是要求如何實現解決方案,畢竟這可能不是正確的解決方案。 – BalusC 2010-10-11 19:07:10

回答

5

基本上,你必須通過父母本身或父類型到B的構造函數。下面的例子說明了最後一種情況。

class A { 
    B b; 

    A() { 
     b = new B(getClass()); 
    } 
} 

class B { 
    Class<?> parentClass; 

    B(Class<?> parentClass) { 
     this.parentClass = parentClass; 
    } 

    void createParent() throws Exception { 
     Object o = parentClass.newInstance(); 
    } 
} 

使用generics您可以使其更安全。但是由於功能要求並不完全清楚,所以我把它留下了。


更新按您的更新,創建實例是毫無意義的。你可以檢查類的類型並進行相應的處理。代替在上述例子中createParent(),做到:

void exit() { 
    if (parentClass == UserX.class) { 
     // Terminate program. 
    } else if (parentClass == UserY.class) { 
     // Logoff user. 
    } 
} 

然而,這是難看。您是否真的不允許在User接口添加另一種方法?否則,以下將是一個更好的設計(稱爲Strategy pattern):

interface User { 
    void exit(); 
} 

class ExitController { 
    void exit(User user) { 
     user.exit(); 
    } 
} 

class UserX implements User { 
    public void exit() { 
     // Terminate program. 
    } 
} 

class UserY implements User { 
    public void exit() { 
     // Logoff user. 
    } 
} 

根據你的最後一句話:

此外,通過比較父對象/類名是看似非常昂貴到它提供的使用

這是沒有意義的。你測過它了嗎?向我們展示結果。

+0

自己做不到更好...... – 2010-10-11 19:59:12

0

如果我正確理解你的問題,我認爲類B將不得不存儲對對象aA.class的引用。這將允許b構建A的新實例。最簡單的方法是使用B的構造函數來獲取類參數。

相關問題