2011-12-02 21 views
3

我在Android代碼(以及其他一些代碼源)中看到了[下文]。它的目的或目的是什麼?方法中變量複製的目的是什麼?

class Foo { 
    int mBar = 1337; 

    static void main(String... args) { 
     System.out.println(isFubar()); 
    } 

    boolean isFubar() { 
     int ret = mBar; // <--- Focus of attention 

     if (ret == 666) 
      return true; 
     else 
      return false; 
    } 
} 

這似乎是浪費時間和資源。 mBar顯然沒有被修改。它沒有被修改的風險(在給定的上下文中),那麼爲什麼要複製這個圖元只是爲了對它進行非侵入檢查並返回呢?在Android源

public void cellToRect(int cellX, int cellY, int cellHSpan, int cellVSpan, RectF dragRect) { 
     final boolean portrait = mPortrait; <--- Here it is 
     final int cellWidth = mCellWidth; 
     final int cellHeight = mCellHeight; 
     final int widthGap = mWidthGap; 
     final int heightGap = mHeightGap; 

     final int hStartPadding = portrait ? mShortAxisStartPadding : mLongAxisStartPadding; 
     final int vStartPadding = portrait ? mLongAxisStartPadding : mShortAxisStartPadding; 

     int width = cellHSpan * cellWidth + ((cellHSpan - 1) * widthGap); 
     int height = cellVSpan * cellHeight + ((cellVSpan - 1) * heightGap); 

     int x = hStartPadding + cellX * (cellWidth + widthGap); 
     int y = vStartPadding + cellY * (cellHeight + heightGap); 

     dragRect.set(x, y, x + width, y + height); 
    } 
+0

你能指出具體的例子嗎? –

+0

我不知道,但我會看看歷史,看看是否有可能是一個重要的版本。 –

+2

也許開發人員只是討厭「m疣」。但是,通過製作副本並使副本最終確認,他/她表示該方法不會修改該字段。 –

回答

2

也許對於多線程。如果mPortrait的值在下面兩行之間改變,那麼您將會得到混合結果。

final int hStartPadding = mPortrait ? mShortAxisStartPadding : mLongAxisStartPadding; 
final int vStartPadding = mPortrait ? mLongAxisStartPadding : mShortAxisStartPadding; 

例如:

final int hStartPadding = true ? mShortAxisStartPadding : mLongAxisStartPadding; 
// somehwere else: mPortraint = false 
final int vStartPadding = false ? mLongAxisStartPadding : mShortAxisStartPadding; 
+0

有效的一點。這是最有意義的。 – AedonEtLIRA

0

編輯特定例從類CellLayout我使用它,這樣我可以修改遞歸或循環和與原來的不亂的變量。它還有助於在類和其他方法之間傳遞變量。

另外,如果該方法在運行時改變時,該方法將不會弄亂,它將繼續與它開始的變量。當我的圖形打印和代碼多線程時,我遇到了這個主要問題。代碼會改變變量,怪異的東西會在屏幕上發生。

我不知道有關硬件或速度,但在代碼方面,它使得它非常簡單和靈活在許多情況下。

+0

爲了您的第一個迴應,我同意如果變量被修改。第二,這隻對物體很重要。基元是按值傳遞的,所以通過確切的變量並不重要。 – AedonEtLIRA

+0

我同意,這是我能想到的唯一解釋。我編輯了我的答案,記得我曾經遇到過的問題。注意它調用全局變量,而不是發送到方法的變量。 –

1

想到一些想法。

  1. 檢索類的成員變量所需的表達可能很複雜(你的例子是沒有),所以它保存在一個局部變量可能是更具可讀性。

  2. 可能的是,將其存儲在局部變量是更有效的,特別是如果該方法具有訪問值超過一次。 (你的榜樣並沒有這樣做。)

  3. 檢索價值一旦得到它的價值在那個時刻,而不是一些後來值另一個線程可能在此期間已經修改。

  4. 在一個局部變量保存它很容易用調試器檢查。

對於您的特定示例,只有理由(4)有任何意義。

+0

說的比我好 –

相關問題