2012-12-19 14 views
12

當我學習Java標準版時,getter和setter函數經常用於隱藏變量並減少對它們的直接訪問。有幾個消息來源告訴我,在Android中你不應該使用這些函數,而只是直接修改變量。原因是在Android中使用獲取器和設置器時會因爲開銷而導致性能損失。導致更多的內存使用並降低系統性能。Setter和Getter函數。在Android中。性能開銷?

這有什麼道理嗎?如果有的話,爲什麼使用getter和setter會導致性能損失?

+1

根據[d.android(http://developer.android.com/training/articles/perf -tips.html#internal_get_set)你應該避免它們。好問題!儘管我必須想知道,如果我完全相反,我的應用會有多大的成功? –

+0

文件確實說避免它們,但我不認爲在大多數情況下壓力是重要的。我偶爾會使用它們來暴露某些字段,但是您可能只是假設它們會增加一些開銷而使用它們。將呼叫保留在循環/密集處理塊中,您應該沒問題。 –

回答

9

如文檔中發現here使用getter和setter是Android的一個壞主意。因爲它說,

這是Android上的一個壞主意。虛擬方法調用非常昂貴,比實例字段查找要多得多。這是合理的,遵循 常見的面向對象的編程實踐,並有getter和setter方法 在公共接口,而是一個類中,你應該總是直接 接入領域。

查找更多關於性能here

+6

補充說明:這很大程度上指向*內部*在方法*很簡單*時使用此方法進行獲取和設置。對於良好的編程實踐,*外部*對這些值的調用應該通過getter和setter;並且應該通過[幹](http://en.wikipedia.org/wiki/Don't_repeat_yourself)的方法進行內部不平凡的獲取和設置。 – Eric

+0

@Eric謝謝你。 – Vinay

4

的getter和setter方法的性能損失可以忽略不計。公有領域是不好的做法,違反了數據封裝和信息隱藏的面向對象原則。

使用調節器或吸氣劑需要一種性能呼叫不是直接訪問字段更多。這沒什麼,所以不要擔心 - 專注於編寫好的代碼。

編輯:

爲了澄清,這是與其他海報都引用相同的android文件:

這是合理的,遵循共同的面向對象的編程實踐 並有getter和setter方法在公共界面,但在 類中,您應該始終直接訪問字段。

換句話說,你仍然需要getter和setter方法。你應該儘量避免在擁有這些方法的類中調用它們,因爲你可以直接訪問該字段。

+0

downvote的任何解釋? –

+3

正如@Handr的回答中所述,他們的表現在android中可以說不是「可以忽略的」(3-7倍慢),但是否則你的答案是現貨 - 在類內部直接訪問,除了普通類外的所有外部getter/setters 。 – iagreen

7

據谷歌Android團隊提供的性能提示:

如果沒有JIT,直接字段訪問大約3倍比調用 瑣碎的getter更快。通過JIT(直接字段訪問與訪問本地的直接字段訪問一樣便宜),直接字段訪問比調用一個簡單的getter快7倍。

但是我不同意,一個良好的編碼習慣,更重要的和球隊也提到:

需要注意的是,如果你使用ProGuard,你可以有最好的兩個世界 因ProGuard可以爲您插入訪問器。

因此,我認爲這是確定使用getter和setter)

Reference