2012-01-16 67 views
2

我讀了Android開發者指南本節:Android開發者:避免內部獲取者/設置者?

here

,我想知道什麼是「虛擬方法調用」又是什麼意思時,它說:「本地」使用的getter/setter ?我試圖弄清楚他們說的是避免使用方法EVER(例如來自實例化對象的方法)還是僅僅在已經在工作的類中獲取變量?

總結起來,如果我在不同的班級,我想知道在不同班級中的變量的值,那麼執行otherclass.getX()會比做otherclass.x更昂貴嗎?或者,如果它不在當前類中執行方法或直接訪問公共變量,它是否具有相同的性能?

回答

2

使用getter和setter方法是更昂貴的,因爲第一個虛擬機從一個虛擬的方法查表的方法,然後撥打電話。 爲了更快地訪問Android,直接訪問成員變量減少了開銷

+0

因此,我決定是否需要方法的便利性或訪問公共成員的性能收益? – 2012-01-16 06:47:31

3

在那篇文章中,他們指的是內部訪問私有成員,並直接在字段中進行訪問,而不是在同一個類中調用getX()。

仍然建議(和普通)使會員私密並提供公共訪問者方法供外部使用。

HTH

2

本文的基本內容是避免getter/setter模式,當你可以避開它時。在Java中,所有方法都是虛擬的,沒有用private或final修飾符標記,所以他們說如果你的代碼不是由其他類實現的接口,直接訪問這些字段。他們指出的原因很可能是因爲傳統上,Java建議始終使用getter/setter模式,以便您的變量可以保持私密。然而,在Android中,如果添加這個額外的抽象層,則可以獲得相當精彩的性能。

所以,總結。如果你正在創建一個其他類將實現的API,那麼也許值得讓getter/setter的性能受到影響。但是,在你自己的類中,每個類都與每個類互相作用,而你沒有執行合約,只需直接訪問變量。訪問您班級的外部班級也會通過直接訪問變量來獲得相同的績效提升,但在某些時候,您需要進行績效維護性評估,以查看您是否願意公開這些變量或是否值得打擊和使用getter/setter方法

0

在Java中總是使用getter(並經常使用setter)有很多很好的理由,即使在爲Droid編寫代碼時,仍然堅持使用它。

儘管天真地使用虛擬方法(即getters/setters)而不是實例字段訪問,Dalvik的成本更高 - 您可以通過使用ProGuard在構建時內聯這些調用來避免這種情況!

以這種方式,您在編碼時堅持最佳實踐,同時避免任何性能下降。