方法中变量重复的目的是什么?

时间:2011-12-02 18:59:23

标签: java

我在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源中类CellLayout的具体示例

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);
    }

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

想到了一些想法。

  1. 检索类成员变量所需的表达式可能非常复杂(您的示例不是这样),因此将其保存在局部变量中可能更具可读性。

  2. 将其存储在局部变量中可能更有效,尤其是当方法必须多次访问该值时。 (你的例子没有这样做。)

  3. 检索值一次在该时刻获取其值,而不是在此期间另一个线程可能已修改的某个后续值。

  4. 将其存储在局部变量中可以很容易地使用调试器进行检查。

  5. 对于您的特定示例,只有理由(4)才有意义。

答案 2 :(得分:0)

我使用它,所以我可以在递归或循环中修改变量,而不是弄乱原始变量。它还有助于在类和其他方法之间传递变量。

此外,如果在方法运行时更改它,方法不会搞砸,它将继续使用它开始的变量。我在使用图形打印和代码进行多线程处理时遇到了这个主要问题。代码会改变变量,屏幕上会出现奇怪的东西。

我不了解硬件或速度,但在代码方面,它在很多情况下非常简单和灵活。