Java 方法中变量复制的目的是什么?
我在Android代码(和其他一些代码源)中看到了这一点。它的目的是什么Java 方法中变量复制的目的是什么?,java,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
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;
}
}
class-Foo{
int mBar=1337;
静态void main(字符串…参数){
System.out.println(isFubar());
}
布尔isFubar(){
int ret=mBar;//我使用它,这样我可以在递归或循环中修改变量,而不会弄乱原始变量。它还有助于在类和其他方法之间传递变量
此外,如果在方法运行时更改了它,该方法将不会出错,它将继续使用它开始使用的变量。我在多线程处理图形打印和代码时遇到了这个主要问题。代码会更改变量,屏幕上会发生奇怪的事情
我不知道硬件和速度,但在代码方面,它在许多情况下都非常简单和灵活。我想到了一些想法
检索类成员变量所需的表达式可能非常复杂(您的示例并非如此),因此将其保存在局部变量中可能更具可读性
将其存储在局部变量中可能更有效,尤其是当该方法必须多次访问该值时(您的示例没有这样做)
一旦检索到该值,就会得到它在那个时刻的值,而不是另一个线程可能同时修改的某个稍后的值
将其存储在局部变量中可以方便地使用调试器进行检查
对于您的特定示例,只有原因(4)才有意义。可能是多线程。如果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;
你能举出一个具体的例子吗?我不知道,但我会看看历史,看看是否有一个版本是重要的。也许开发人员只是讨厌“m疣”。但认真地说,通过制作副本并使副本成为最终副本,s/he表明此方法不会修改字段。@DavidV这是有意义的。我甚至没有想到这一点。@DwB您是否更喜欢mBar=8008
?;-)作为第一个响应,我同意是否修改了变量。对于第二个,这只对object重要s、 原语是按值传递的,因此是否传递了确切的变量并不重要。我同意,这是我能想到的唯一解释。我编辑了我的答案,记住了以前的问题。注意,它调用的是全局变量,而不是发送给方法的变量。
final int hStartPadding = true ? mShortAxisStartPadding : mLongAxisStartPadding;
// somehwere else: mPortraint = false
final int vStartPadding = false ? mLongAxisStartPadding : mShortAxisStartPadding;