所以我目前所面临的问题是,我想编写一个方法,创建一个可运行的改变给定值; 在这种情况下,它是一个Boolean对象。
(我用这个,使其可以对不同的方式应对一个按键)
如果我只是用传递对象的方法,它工作得很好。
然而:
public static Runnable createOnOffSwitchRunnable(Boolean b)
{
final Boolean Reference = b;
Runnable R = new Runnable()
{
public void run()
{
if (Reference.booleanValue() == true)
{
Reference = false;
}
}
};
return R;
}
显然,这是不行的,因为我不能直接赋值给最后一个变量和布尔对象没有“设置” -方法。 不过,我需要声明它最终甚至能够创建了Runnable。
那么,有没有办法可以如何改变一个传递价值,用一个可运行的? (这将是很好,如果我能继续使用标准的Java类型,而不是“创造”一些新的类)
如果是这样,是否有保存和传递方法有其它方法吗?
任何帮助,将不胜感激 (:
你叫局部变量Reference
仅存而createOnOffSwitchRunnable
正在运行,当它返回时消失; 这是没有意义的修改。 您可以修改,虽然一个实例变量,如果你的情况是有道理的。 如果你这样做,你应该声明变量volatile
,防止陈旧读取(也被称为“盲点法” )。
volatile Boolean Reference;
public static Runnable createOnOffSwitchRunnable(Boolean b)
{
Reference = b;
Runnable R = new Runnable()
{
public void run()
{
if (Reference.booleanValue() == true)
{
Reference = false;
}
}
};
return R;
}
另一种选择是做Reference
的Runnable的实例变量。 这也可能解决你的问题,我不知道你想做什么。
public static Runnable createOnOffSwitchRunnable(final Boolean b)
{
Runnable R = new Runnable()
{
private Boolean Reference = b;
public void run()
{
if (Reference.booleanValue() == true)
{
Reference = false;
}
}
};
return R;
}
(另外,请使用标准的命名约定,写它的标题案例Reference
看起来像一个类的名称。)
您可以使用这一招,这是接近你会得到你的意图:
public static Runnable createOnOffSwitchRunnable(final Boolean... b) {
return new Runnable() {
public void run() {
if (b[0].booleanValue()) {
b[0] = false;
}
}
};
}
我已经做了以下情况:
- 取得了最终的参数,而不是如果创建一个单独的最终局部变量
- 取得的参数varags,这实际上是在该方法内的阵列,但主叫方可以用单个布尔参数调用,以便有效地将签名如下这种情况下的相同
- 参数数组是最终的,但它的内容不是-这是“绝招”
- 简化了逻辑::测试
booleanValue==true
是抗图案,只是测试的booleanValue本身 - 返回了Runnable,而无需创建(不必要的)局部变量
使用AtomicBoolean
。 这将有被线程安全的优势。