Java 如何对给定值进行可运行更改

Java 如何对给定值进行可运行更改,java,runnable,Java,Runnable,所以我现在面临的问题是,我想写一个方法,创建一个runnable来改变给定的值;在这种情况下,它是一个布尔对象 (我使用它,使人们能够以不同的方式作出反应 (按一个键) 如果我只是使用传递对象的一个方法,它就可以正常工作 然而: public static Runnable createOnOffSwitchRunnable(Boolean b) { final Boolean Reference = b; Runnable R = new Runnable() {

所以我现在面临的问题是,我想写一个方法,创建一个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==true
    是一种反模式,只需测试booleanValue本身
  • 返回Runnable而不创建(不必要的)局部变量

您可以使用此技巧,它将尽可能接近您的意图:

public static Runnable createOnOffSwitchRunnable(final Boolean... b) {
    return new Runnable() {
        public void run() {
            if (b[0].booleanValue()) {
                b[0] = false;
            }
        }
    };
}
我已经做了以下工作:

  • 如果创建单独的最终局部变量,则将参数设置为final
  • 使参数varags实际上是方法内部的一个数组,但是调用方可以使用单个布尔参数调用它,因此签名在这种情况下看起来是一样的
  • 参数数组是最终的,但其内容不是-这是“技巧”
  • 简化了逻辑::测试
    booleanValue==true
    是一种反模式,只需测试booleanValue本身
  • 返回Runnable而不创建(不必要的)局部变量

您无法更改不可变对象。这就是它们不可变的原因。顺便说一句,此代码没有太大意义…您只需更改局部变量的值-即,当runnable开始运行时,甚至不再在范围内…请尝试一秒钟来了解我的问题。当然,我无法更改最终值。这不是问题所在。问题是,如果没有办法用runnable来更改值,如果是这样,如果有另一种方法可以使用Simmilary,您可以将引用传递给持有布尔值的对象,并直接更改它。您还可以将其公开为静态,这样它就可以在任何地方访问。您可以做很多事情。“正确”第一,很大程度上取决于情况纠正我的错误,但是公共静态不意味着它可以被其他所有类调用吗?布尔b也是一个对象,所以你可以将每个对象传递给它,而不仅仅是一个本地对象。你不能更改不可变的对象。这就是为什么它们是不可变的。顺便说一句,这段代码没有太多意义…你只需要nge局部变量的值-当runnable开始运行时,甚至不再在作用域内…请尝试一秒钟来理解我的问题。当然,我不能更改最终值。这不是问题。问题是是否无法使用runnable更改值,如果是,是否有其他类似的方法你可以将一个引用传递给持有布尔值的对象,并直接对其进行更改。你也可以将其公开为静态的,这样它在任何地方都可以访问。你可以做很多事情。“正确的”第一,很大程度上取决于情况如果我错了请纠正我,但是公共静态不意味着它可以被其他所有类调用吗?布尔b也是一个对象,所以你可以将每个对象传递给它,而不仅仅是本地对象。嘿!这真的很有效。非常感谢(:对于临时变量:它应该是一个引用,所以无论我调用b.x还是Reference都不重要。x作为“Reference”被定义为…对b的引用。我错了吗?@JonasBartkowski这很重要。它应该是
Reference
。而不是
Reference
我不是在谈论命名约定