簡體   English   中英

為什么有些android代碼有公共字段?

[英]Why does some android code have public fields?

關於在面向對象編程中使用公共字段有很多問題和答案,並且大多數建議不要使用公共字段有很多原因。

但是當我查看Android的代碼時,我發現一些類正在使用公共字段。 例如, Android.view.View具有公共字段mCachingFailedmAttributes

他們為什么公開? 很難想象這是谷歌和AOSP的錯誤。

擁有公共領域本身並不是一個錯誤。 正如賞金記錄所暗示的那樣,並非“OOP基本違規”。 畢竟這兩個類(大多數用途)相同:

public class DemoA {
  public int field;
}

public class DemoB {
  private int field;

  public int getField() { return field; }
  public void setField(int value) { field = value; }
}

也就是說,如果你打算讓調用者對字段有直接的讀寫訪問權限,那么添加一個getter和setter可能只是額外的樣板。

即使除了讀取和寫入字段之外沒有其他工作,getter和setter的好處是它們抽象出數據存儲在字段中的事實。 它可以存儲在外部數據源中,也可以動態計算,或者任何你想要的,並且調用者不必擔心行為是如何實現的。 這通常是一種很好的做法因為它將調用者關注點(API)與您的關注點(實現)分開。

然而,有時它只是矯枉過正,如果這是提供調用者所需行為的最佳方式,那么暴露公共字段是完全合理的。 大多數情況下,這是做價值類型 ,即存在只是為了組若干領域的共同類。 當你需要上課時所做的一切都可以通過簡單地公開領域來完成,寫出幾十個吸氣劑和制定者幾乎沒有什么好處。

實際上,Android還有一個額外的問題。 方法調用很昂貴,應用程序可以(輕松)定義的方法數量限制為~65k 對於可以安全執行此操作的情況,直接暴露字段可將方法開銷減少兩倍,從而節省寶貴的CPU時間。 這可能看起來不是很多,但它很快就會增加。

從developer.android.com查看此部分:

在像C ++這樣的本地語言中,通常的做法是使用getter(i = getCount())而不是直接訪問字段(i = mCount)。 這是C ++的一個很好的習慣,並且經常用於其他面向對象的語言,如C#和Java,因為編譯器通常可以內聯訪問,如果您需要限制或調試字段訪問,您可以隨時添加代碼。

但是,這在Android上是一個壞主意。 虛擬方法調用比實例字段查找要昂貴得多。 遵循常見的面向對象編程實踐並在公共接口中使用getter和setter是合理的,但在類中,您應該始終直接訪問字段。

沒有JIT,直接字段訪問速度比調用一個簡單的getter快約3倍。 使用JIT(直接字段訪問與訪問本地一樣便宜),直接字段訪問比調用一個簡單的getter快約7倍。

請注意,如果您正在使用ProGuard,那么您可以充分利用這兩個領域,因為ProGuard可以為您提供內聯訪問器

http://developer.android.com/training/articles/perf-tips.html#GettersSetters

最有可能的是,這就是您在AOSP中看到公共字段的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM