2011-09-01 83 views
7

我想寫一個簡單的球類比賽,並且有幾個轉身(即球的生命)。當球通過屏幕底部邊界時,球「死亡」。我至今的作品,但並不似乎是做事情的正確方法:對象是否可以自行移除?怎麼樣?

if (ball.getY() > bottomOfScreen) { 
    ball.die(); 
    remove(ball); 
} 

模具()方法基本上淡出球的顏色慢慢地(dark_gray - >暫停(50) - > light_gray - >暫停(50)),但實際上並沒有做任何有用的事情。

顯然,remove()從屏幕上擺脫了球,這正是我想要的。對我來說這個remove()是Ball的die()方法的一部分,而不是它在主程序中是一個單獨的方法調用 - 但我不知道如何去做這件事?

對象是否可以自行刪除?而且,如果可以的話,從哲學/方法論角度來看,反對比謀殺更好嗎?

謝謝!

+0

只有一個建議。刪除應首先確保球死亡,如果沒有,然後調用它的方法die(),然後將其刪除。 –

回答

4

由於對象具有對視圖渲染機制的某種引用,因此該對象可以將其自身刪除。您的樣品不提供足夠的信息,所以我會舉例說明這樣做的一種方法:

public class Ball { 
    private ViewRenderer view; 

    public void remove() { 
     view.remove(this); 
    } 
} 

也不自殺也不謀殺是好還是壞。這取決於你的設計和要求。

在這個例子雖然謀殺可能是因爲這樣的Ball對象需要知道在哪個上下文的正在使用最好

+1

對不起,我必須爲此付出代價。它可以工作,但它引入了一個循環引用 - Ball引用了ViewRenderer,並且(大概)ViewRenderer引用了Ball。這樣的事情會使測試比他們需要的複雜得多。 – DJClayworth

+0

感謝您解釋您的推理。你是對的,儘管在更復雜的情況下(即使用MVC/Observer模式),對象可能會請求刪除,例如通過常規變更處理程序。 –

2

從某種意義上說,從內存中刪除對象:不,在垃圾回收器專門處理的Java中。

你可以做的是從包含它的集合中刪除對象,但是這會要求對象有權訪問這些集合(在大多數情況下這是不可行的,因爲可能有很多集合)。

我會建議包含對象(在你的情況下屏幕)輪詢包含的對象的(球)的狀態,並刪除它後,它實際上已經死了。

3

可以創建一個方法,在該方法中球可以自行移除,但這是一件壞事。爲了從屏幕上移除它,球必須有一個對屏幕的引用。這會創建一個循環的引用鏈(Ball有一個對屏幕的引用,屏幕引用了Ball),這會使您的設計更加複雜,並且您的測試更加複雜。

自殺很好 - 屏幕告訴球死了,球死了。但這是關於消除關係,而不是死亡。維持這種關係的東西是屏幕,所以它應該是做刪除的事情。

另外請記住,兩者不一定必須一起發生。屏幕可能因爲某種原因想要保持死球,並且它可能想要移除一個沒有死的球。即使現在您的應用中沒有發生這種情況,也要考慮到這種可能性。

1

大概有一些物體(例如,屏幕或Johan的示例中的ViewRenderer),該對象持有對Ball的引用,並且刪除該引用必須由屏幕(「對象謀殺」)完成。 「對象自殺」等同於Ball將消息傳遞給屏幕,要求「被謀殺」。

因爲Ball知道它何時通過了邊界,所以對我來說(對於你的設計的細節不知道你的設計的細節)對於由Ball發起的去除是有意義的。然後屏幕可以通過以下幾種方式中的一種查找有關此更改的信息:

  • 屏幕可以輪詢球。
  • Ball可以持有對Screen的直接反向引用,這會創建一個不幸的循環依賴。
  • 球可以通過一個BallObserver接口保存對屏幕的引用。這是observer pattern的應用程序。

第一個是最簡單的,如果它自然地適合您的繪製屏幕的機制,這將是一個不錯的選擇。第三種原則上更靈活,但在實踐中你可能不需要這種靈活性。在一個簡單的程序中,中間選項可能沒問題,但你可以把它看作是邁向第三步的一步。

如果你有一個屏幕(或ViewRenderer,或其他)的對象,真正的意思是「在主程序中的一個單獨的方法調用」,那麼你應該重新考慮你的設計。

0

不,對象不能自殺。任何參考本身只是一個參考。

要「清除」其內部的對象,只需清除所有實例變量。

要「清除」自身以外的對象,可以將變量設置爲null。

相關問題