如何使一个Runnable改变给定值(How to make a Runnable Change a

2019-09-28 07:38发布

所以我目前所面临的问题是,我想编写一个方法,创建一个可运行的改变给定值; 在这种情况下,它是一个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类型,而不是“创造”一些新的类)

如果是这样,是否有保存和传递方法有其它方法吗?

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

Answer 1:

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



Answer 2:

您可以使用这一招,这是接近你会得到你的意图:

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,而无需创建(不必要的)局部变量


Answer 3:

使用AtomicBoolean 。 这将有被线程安全的优势。



文章来源: How to make a Runnable Change a given value
标签: java runnable