我在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);
}
答案 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)
想到了一些想法。
检索类成员变量所需的表达式可能非常复杂(您的示例不是这样),因此将其保存在局部变量中可能更具可读性。
将其存储在局部变量中可能更有效,尤其是当方法必须多次访问该值时。 (你的例子没有这样做。)
检索值一次在该时刻获取其值,而不是在此期间另一个线程可能已修改的某个后续值。
将其存储在局部变量中可以很容易地使用调试器进行检查。
对于您的特定示例,只有理由(4)才有意义。
答案 2 :(得分:0)
我使用它,所以我可以在递归或循环中修改变量,而不是弄乱原始变量。它还有助于在类和其他方法之间传递变量。
此外,如果在方法运行时更改它,方法不会搞砸,它将继续使用它开始的变量。我在使用图形打印和代码进行多线程处理时遇到了这个主要问题。代码会改变变量,屏幕上会出现奇怪的东西。
我不了解硬件或速度,但在代码方面,它在很多情况下非常简单和灵活。