2012-07-16 34 views
4

當通過JAX_WS端點的要求一起去,我碰到這個來了,JAX-WS端點實現類必須沒有實現'完成()`方法

JAX-WS endpoint implementation class must not implement `finalize()` method. 

,但我沒有找到一個更好的答案解釋這個。爲什麼我們不應該實現finalize()方法,如果我們實現會發生什麼?

有人可以指出這一點嗎?

回答

2

正如您所解釋的那樣,JAX-WS端點不應該實現finalize方法(請檢查this)。

爲什麼?

JVM無法保證finalize方法的執行。理論上,當物體被垃圾收集時,將會調用最終化方法,但是何時收集?沒有辦法知道:有時它會立即收集,也許它會一直活着直到JVM停止(這意味着永遠不會)。實際上,這與GC算法有關,每個JVM都有自己的實現,並且每個JVM都有很大的不同,因爲沒有關於此算法行爲的規範。

但真正的問題是,一些java程序員不知道這一點,他們使用finalize方法作爲'析構函數'。一個示例:您有一個在其構造函數中創建JDBC連接的類。因此,爲了使它不錯你決定在'析構函數'(finalize)中釋放這個連接。結果:你不知道連接何時關閉,或者它永遠不會關閉!

這就是爲什麼實現finalize方法被認爲是任何java類的不良做法,並且在某些框架中被禁止避免誤解(即JAX-WS)。

恕我直言,這種方法應該從Object API被刪除,但它仍然存在......也許爲了向後兼容或有用的用法,我無法想象;-)

檢查this用於讀取周圍更多的意見完成實施。

+0

非常感謝。當您解釋關於GC算法時,我還有一個問題,當您說GC算法的行爲沒有規範時,您的意思是什麼? – 2012-07-17 06:58:01

+0

* Java虛擬機*不是軟件,而是規範(http://docs.oracle.com/javase/specs/jvms/se7/html/index.html)。這個規範描述了JVM應該做什麼。然後,每個實現者(Oracle Rockit,IBM JVM,Sun/Oracle JVM)都將遵循此規範來創建真實的事物。如果您有時間閱讀一些內容,您會發現沒有規範定義應如何實施內存管理和垃圾收集。出於這個原因,每個JVM提供者都有不同的方法來管理內存和自己的GC算法。 – ggarciao 2012-07-17 07:43:58

+0

非常感謝有價值的信息。 – 2012-07-17 11:35:51

相關問題