Java 如何对给定值进行可运行更改
所以我现在面临的问题是,我想写一个方法,创建一个runnable来改变给定的值;在这种情况下,它是一个布尔对象 (我使用它,使人们能够以不同的方式作出反应 (按一个键) 如果我只是使用传递对象的一个方法,它就可以正常工作 然而:Java 如何对给定值进行可运行更改,java,runnable,Java,Runnable,所以我现在面临的问题是,我想写一个方法,创建一个runnable来改变给定的值;在这种情况下,它是一个布尔对象 (我使用它,使人们能够以不同的方式作出反应 (按一个键) 如果我只是使用传递对象的一个方法,它就可以正常工作 然而: public static Runnable createOnOffSwitchRunnable(Boolean b) { final Boolean Reference = b; Runnable R = new Runnable() {
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;
}
显然,这不起作用,因为我不能直接给最终变量赋值,布尔对象没有“set”方法。但是,我需要声明它是最终的,以便能够创建Runnable
那么,您是否无法使用runnable更改传递的值?(如果我能继续使用标准java类型,而不是“发明”一些新类,那就太好了)
如果是,是否有其他保存和传递方法
任何帮助都将不胜感激(:您调用的局部变量
Reference
仅在createOnOffSwitchRunnable
运行时存在,并在返回时消失;修改它没有意义。但是,如果实例变量在您的情况下有意义,您可以修改它。如果这样做,您应该声明变量volatile
,以防止陈旧读取(也称为)
另一个选项是在Runnable中设置Reference
实例变量。这也可能解决您的问题,我不知道您在尝试做什么
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
看起来像类的名称。)您调用的局部变量Reference
仅在createOnOffSwitchRunnable
运行时存在,返回时消失;修改它没有意义。但是,如果实例变量在您的情况下有意义,您可以修改它。如果这样做,您应该声明变量volatile
,以防止ale读取(也称为)
另一个选项是在Runnable中设置Reference
实例变量。这也可能解决您的问题,我不知道您在尝试做什么
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;
}
}
};
}
我已经做了以下工作:
- 如果创建单独的最终局部变量,则将参数设置为final
- 使参数varags实际上是方法内部的一个数组,但是调用方可以使用单个布尔参数调用它,因此签名在这种情况下看起来是一样的
- 参数数组是最终的,但其内容不是-这是“技巧”
- 简化了逻辑::测试
是一种反模式,只需测试booleanValue本身booleanValue==true
- 返回Runnable而不创建(不必要的)局部变量
public static Runnable createOnOffSwitchRunnable(final Boolean... b) {
return new Runnable() {
public void run() {
if (b[0].booleanValue()) {
b[0] = false;
}
}
};
}
我已经做了以下工作:
- 如果创建单独的最终局部变量,则将参数设置为final
- 使参数varags实际上是方法内部的一个数组,但是调用方可以使用单个布尔参数调用它,因此签名在这种情况下看起来是一样的
- 参数数组是最终的,但其内容不是-这是“技巧”
- 简化了逻辑::测试
是一种反模式,只需测试booleanValue本身booleanValue==true
- 返回Runnable而不创建(不必要的)局部变量
Reference
。而不是Reference
我不是在谈论命名约定