2013-03-14 65 views
0

問題是我有2個班。第一個類有一個創建第二個類的對象的方法。有沒有可能得到該對象沒有返回語句?並且還沒有使其成爲一個字段如何獲得在void方法內實例化的對象?

實施例:

//第一類

public class First { 

    public First() { 
    } 

    public void aMethod(Object o) { 
     Second s = new Second(o); 
    } 
} 

//第二類

public class Second { 

    public Second() { 
    } 
} 

該方法是通過一個按鈕的點擊調用。

編輯: 很抱歉的混亂。但我不想更改代碼的原因是因爲我正在進行JUnit測試。

這兩個類實際上是jFrames,我想測試的按鈕。 在第一個類中,通過按鈕調用該方法。在該方法中,它創建第二個Jframe。在這個Jframe中,我也想測試一個按鈕,這就是爲什麼我需要實例化的jFrame對象。 在aMethod()我也傳遞了一些參數,第二個JFrame需要。所以我不能單獨測試它。

+2

可以'amethod方法()'有參數(S)? – Kent 2013-03-14 15:11:21

+0

您提出的問題並沒有什麼意義 - 如果您想在「First」之外使用它,您爲什麼不想返回's'?請你可以編輯你的問題來解釋**你想達到什麼**,而不是**你認爲你應該達到什麼樣的**? – 2013-03-14 15:11:56

+0

可能是這可以幫助: - http://stackoverflow.com/questions/2408626/returning-a-void-object – 2013-03-14 15:13:05

回答

1

這一切都取決於你的第一個對象是如何線程安全的/必須。

您可以設置一個實例變量,然後露出一個getter,但也許你正在嘗試一些其他方面的限制內工作,因爲這似乎是一個很奇怪的替代剛剛返回值。

public class First { 
    private Second s; 
    public First() { 
    } 

    public void aMethod() { 
     s = new Second(); 
    } 

    public Second getSecond(){ 
     return s; 
    } 
} 

編輯:另一個答案,因爲我以某種方式錯過了無場約束。

你可以使用可觀察的圖案,讓你的聽衆第一客戶端對象寄存器,然後你可以做;

Second s = new Second(); 
setChanged(); 
notifyObservers(s); 

http://docs.oracle.com/javase/6/docs/api/java/util/Observable.html

同樣,這似乎有點小題大做,也許你可以給更多的背景下,以你不能編輯方法簽名或使用領域的原因。

+4

'「...也沒有使它成爲一個領域」' – Dukeling 2013-03-14 15:16:07

+0

哦,是的,不知道我是如何錯過了Dukeling。 – James 2013-03-14 16:02:41

0

您也可以爲您傳遞到方法調用parmeter內返回。 類似:

public void aMethod(Result result) { 
      s = new Second(); 
      result.val = s; 
     } 

,其中結果可能是具有類型二的成員的類。 或者一個泛型類:

Result<Second> 

,但我不知道怎麼會比簡單的回報更好。

1

有兩種可能性我能想到的:

1)aMethod()例如List list (or other types has Second Field),那麼你可以list.add(new Second())主叫方可以從列表中得到它(最後一個元素)

2)另一種添加參數(如果你有),有一個靜態字段private static Second second,你必須寫setter/getter,還要關心線程安全問題......然後你可以在aMethod()Foo.setSecond(new Second());真的不好在實踐中。

最後,我會問,你真的需要這樣做嗎?

0

最常見的是在使用所謂的工廠模式

public class First { 

public First() { 
} 

public Second aMethod(Object o) { 
    return new Second(o); 
} 

}