2015-06-05 134 views
1

實例變量是否優先於局部變量,反之亦然?例如,使用SharedPreferences,它應該在類的頂部聲明,然後在整個範圍內引用,或者是否應該在每種方法中聲明它需要?Android實例變量

我想知道是否會有很大的內存使用差異,因爲實例變量會持續只要活動;然而,它會更清潔,因爲我不需要在它使用的每種方法中實例化它。

回答

3

你應該更喜歡局部變量在類變量任何一天。

擁有大量影響不同方法中代碼執行的實例變量會給你帶來很多狀態。這使得很難推理它,例如,當你試圖通過頭腦中的功能來發現錯誤時。

我喜歡通過不使用對象狀態static並傳遞他們需要的所有參數作爲參數的方法來更進一步。這樣,您可以查看完全與類上下文隔離的此功能。 我的目標是結束pure functions,這很容易推理。

如果有必要讓這些功能中的一個不純,那可能意味着糟糕的設計決定!


然而有一些東西的地方是有意義的「緩存」他們在類級別:

  • 從您的佈局圖。 findViewById()的成本非常高,所以如果你認爲你需要更多的方法,那麼你應該「緩存」它。 ButterKnife庫使這非常簡單。
  • 數據庫連接或實際上任何開啓/關閉成本很高的任何東西。 但是,請勿將這些「鋪設」在活動中。將它們隱藏在一個類中,並使該類負責處理打開的資源。

一般來說:類變量使你的類更加有狀態。對於性質穩定的類(例如ActivityFragment),這是很好的,但是你應該儘量減少你必須擔心的狀態量。

+0

很高興知道'findViewById()'。謝謝。 – mattfred

0

它取決於你想要的變量的用途。如果你想要一個在整個類中需要的變量,你將需要在類的頂部聲明它,但是如果相反,你要聲明的變量只是在方法上使用,你應該聲明它在這個方法裏面。

如果它使用更多的內存或更少的內存(我真的不知道的概念),我不能對你說,但我可以確保你的代碼將以這種方式更清晰。

我對此並不擔心,但我認爲每次聲明一個變量時都會消耗一些內存使用量,因此,總而言之,如果您在每種方法中都有一個變量,它會消耗更多的內存使用量在班上名列前茅。如果知道這件事的人必須糾正我,請做。

我期待它對你有所幫助!

+1

不是聲明一個變量佔用空間(聲明=「這將是一個int」),但初始化(調用構造函數/賦值)耗費內存。連接到局部變量的唯一的** maginal **問題不是原始的,當沒有更多引用時,它們必須被垃圾收集。 –

+0

@LukasKnuth是的,我想引用初始化而不是聲明。感謝您的支持,並感謝您的解釋! –

1

這個問題似乎歸結爲時間/空間的折衷,在這種情況下,我會說答案取決於。一般情況下,我會默認在對象構建時默認一次讀取持久對象,但特別是在這樣做時,如果有顯着的性能成本。但是,如果在內存中存儲空間並且存儲有問題的對象空間成本過高,那麼我會考慮根據需要來閱讀它。

+0

感謝您輸入@Lee – mattfred