2017-02-27 70 views
3

我有時必須編寫將自己註冊爲偵聽器的對象到其他對象上。良好的編程實踐表示,我們應該始終註銷這樣的聽衆。 試圖通過讓類實現Closeable並取消註冊close()中的偵聽器來強制執行此類行爲是否是一種很好的做法?Java:在Closeable.close()中取消註冊偵聽器

我以爲Closeable主要是爲了關閉操作系統資源(例如文件..),我不確定偵聽程序的情況是否超出了Closeable的責任範圍。

+0

這意味着聽衆會知道如何取消自己的註冊,並跟蹤註冊的任何地方。 –

回答

1

這裏有一些意見,但基於documentationclose方法的名稱,我會爲它創建一個不同的方法(並將其稱爲unregister)。原因是你希望代碼儘可能地不言自明。

還應注意close()本身的文檔:

關閉此流並釋放與之關聯的所有系統資源。如果流已經關閉,則調用此方法不起作用。

根據您描述的代碼,沒有這樣的流或系統資源。

編輯:

順便說一句,似乎如果你想要去的Closeable解決方案,更好的辦法是實施AutoCloseable,而不是因爲它讓你在代碼中使用try-與資源使用這些聽衆。在AutoCloseable的文檔,以下提到:

API注:

這是可能的,而且實際上很常見的,一個基類來實現AutoCloseable即使不是所有的子類或者實例將擁有可釋放的資源。對於必須完全通用的代碼或知道AutoCloseable實例需要資源釋放的代碼,建議使用try-with-resources結構。但是,如果使用支持基於I/O和非基於I/O的表單的Stream等工具,則在使用非基於I/O的表單時通常不需要嘗試使用資源塊。

這注意味着一類可以實現AutoCloseable即使其實現不使用實際資源。但是,注意還表明,至少應該有一個子類(在你的情況下,至少有一種類型的偵聽器)使用實際資源。 Stream API就是這種情況。

+0

我同意,但爲什麼我們需要創建另一個界面?一般的Java開發人員知道'Closeable',並知道如何處理可關閉的對象。 創建另一個接口或'unregister()'方法只會增加API的複雜性。 –

+0

@MarcoRomano我擴大了答案。如果沒有一個監聽器子類使用資源,我仍然會爲它們創建一個單獨的接口。我仍然贊成可重複性,以避免重複使用已存在的內容,但這並不完全適用於我的案例。 – manouti

相關問題