2013-01-05 29 views
1

是可能的嗎? 我有一個類Listener,可以通過很多其他類實例化,所以在Listener裏面我會知道誰是「父親」;知道誰在誰已經實例化本身就是一個類的實例知道自己

我不想使用

if(objectA instanceOf Class) 
.... 

,但我認爲是這樣的:

if(this.instanceOf Class1) 
    System.out.println("Hello i'm the class Listener instanced by Class1); 
else if(this.instanceOf Class2) 
    System.out.println("Hello i'm the class Listener instanced by Class2); 

這是可能的還是我白癡? ;) 感謝 尼古拉

+0

你能解釋一下你的一類「實例化本身」是什麼意思? –

+0

這是你的意思:http://stackoverflow.com/questions/1483075/find-out-instantiating-object-in-the-constructor-of-a-class –

+0

對不起,誰實例化它 – Nicola

回答

1

如果我理解正確的,你想知道什麼類(和這些類的實例),包含對監聽器類的實例。

一個可能的解決方案是創建定義方法的所有「聽衆持有人」必須擁有並監聽器的構造接受它的一個實例的接口(如ListenerHolder)。

public interface ListenerHolder { 
    public void doSomething(); 
} 

public class Listener { 
    public Listener(ListenerHolder holder) { 
     this.holder = holder; 
    } 

    public void doListener() { 
     this.holder.doSomething(); 
    } 

    private ListenerHolder holder; 
} 

雖這麼說,也許你能解釋一下真正的問題是什麼,你正在試圖解決的問題。我懷疑你應該考慮對原始問題提供其他可能的解決方案。

+0

謝謝,我想我可以使用你的解決方案:) ..我創建一個與javaee的發佈者訂閱者通信,所以我有一個Listener類的onMessage方法接收一個對象,並且必須調用另一個實例化它的方法來管理接收的對象的內容..因爲很多類可以實例化類Listener,調用的方法是不同的 – Nicola

+0

問題:我可以使用不同類型的構造函數,每個類可以實例化類Listener。您認爲哪種解決方案最好? – Nicola

+0

@Nicola請提供一些代碼來說明你的想法。我很樂意從那裏提出一些建議。 –

1

如果你只是尋找一個叫做構造函數的對象的Class,this question可能是你在找什麼。在構造函數中獲取堆棧跟蹤,並使用它來確定哪個類稱爲構造函數。

如果你正在尋找的特定對象引用而不是類,你需要將其作爲參數傳遞。

+2

這個話應該只是一個評論,這表明問題是重複 – Scorpion

+0

對不起,答案措辭不當。它可能是也可能不是重複的,這取決於他究竟在問什麼。第二部分代碼在問題的背景下沒有意義,並且讓我不確定要問哪個問題。 – Mike

+0

謝謝,我想我會傳遞對象作爲參數,因爲我還需要調用該類的方法 – Nicola

1

你可以這樣做(只是刪除.-this instanceof ClassA),但在我看來,這是一種不好的做法。如果你想要一個依賴於子類的行爲,只需在每個子類中實現一個方法,然後在此處調用它。

例如:

public class Parent 
{ 
    public void foo() 
    { 
     bar(); 
    } 

    public void bar() 
    { 
     System.out.println("Parent"); 
    } 

    public static void main() 
    { 
     new Parent.foo(); // prints "Parent" 
     new SubA.foo(); // prints "SubA" 
     new SubB.foo(); // prints "SubB" 
    } 
} 

public class SubA extends Parent 
{ 
    @Override public void bar() 
    { 
     System.out.println("SubA"); 
    } 
} 

public class SubB extends Parent 
{ 
    @Override public void bar() 
    { 
     System.out.println("SubB"); 
    } 
} 
+0

謝謝,但我沒有使用繼承 – Nicola