1

所以我目前面临的问题是我想编写一个方法,创建一个改变给定值的可运行;在这种情况下,它是一个布尔对象。

(我使用它,以便能够以不同的方式对按键做出反应)

如果我只是使用传递对象的方法,它工作得很好。

然而:

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 类型而不是“发明”一些新类,那就太好了)

如果是这样,是否有保存和传递方法的替代方法?

任何帮助,将不胜感激 (:

4

3 回答 3

4

你可以使用这个技巧,它尽可能接近你的意图:

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 而不创建(不必要的)局部变量
于 2013-10-04T20:41:26.247 回答
3

你调用的局部变量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看起来像一个类的名称。)

于 2013-10-04T20:22:31.750 回答
1

使用AtomicBoolean. 它将具有线程安全的优点。

于 2013-10-04T20:34:26.733 回答