2011-01-28 37 views
1

由於ActivityThread類的源顯示,它是一個final類,並且此類中的所有方法也是final方法。由於在java中的關鍵字定義爲final,這個類不能被繼承,但爲什麼android開發人員保留這些方法final有關ActivityThread中使用的final關鍵字的疑惑

也許我沒有明確表達這個問題,我在這裏修復它。

ActivityThread是final類,它不會有任何的子類,並沒有方法將被覆蓋,但你知道,在這個類是final所有的方法,我想知道他們爲什麼需要這些final關鍵字,他們可以將其刪除而不會造成影響。

回答

2

Java Language Specification清楚地表明,沒有一個final類的方法可以被重寫。因此,該方法的聲明似乎是多餘的。 (當ActivityThread可能不是最後一類時,可能從Android API的測試版中遺留下來了)

另一方面,優化器和混淆器有時可以用方法final做更多一點。雖然他們應該有足夠的智慧來推斷最終階級不會有任何重疊的方法,但給他們額外的提示並不會帶來什麼傷害。

1

爲什麼android開發人員保持這些方法最終?

實際上,Java工程師是這樣做的。這是一個設計決定:有時候你想禁止對你的一個類進行子分類。爲什麼?其中一些原因是它意味着一些強大的責任,這迫使你做出非常聰明的決定。

讓我約書亞布洛赫引用該項目數的17 Effective Java Second Edition部分:

那麼這是什麼意思對於要設計一個類和記錄繼承? 首先,該類必須準確記錄覆蓋任何方法的效果。換句話說,班級必須記錄自己使用的可重寫方法。對於每個公共或受保護的方法或構造函數,文檔必須指明方法或構造函數調用哪些可覆蓋的方法,以何種順序以及每次調用的結果如何影響後續處理。 (通過覆蓋,我們的意思是非正式的,不論是公共的還是受保護的。)更一般地說,一個類必須記錄任何可能調用可重寫方法的情況。例如,調用可能來自後臺線程或靜態初始化程序。

...

繼承設計涉及的不僅僅是記錄自我使用模式。爲了讓程序員能夠寫出有效的子類而不會帶來過度的痛苦,一個類可能必須以恰當選擇的受保護方法的形式提供內部工作,或者在極少情況下提供受保護的字段。

+0

但我認爲沒有必要爲ActivityThread的方法保留這些最終關鍵字。班級的最後一部分完成了禁止自己及其方法被繼承或覆蓋的工作。 – teok 2011-01-28 05:09:44