【问题标题】:Java | boolean doesn't re-evaluate / update爪哇 |布尔值不会重新评估/更新
【发布时间】:2016-04-22 19:28:44
【问题描述】:

我正在尝试创建一个类,让您可以重复某项任务一定次数,或者直到满足某个条件。在我继续之前,请考虑以下几点:

int test = 0;

还有我的复读课:

public static abstract class Repeat {

    public void loop(int c) {
        for (int i = 0; i < c; i++) {
            run();
        }
    }

    public void until(boolean c) {
        while (!c) {
            run();
        }
    }

    public abstract void run();
}

我遇到的问题是until(boolean c) 方法,不是loop(int c) 方法。 loop 方法工作得很好,如下所示:

public static void main(String[] args) {
    new Repeat() {
        @Override
        public void run() {
            test += 1;
            System.out.println(test); // so I know what test currently is
        }
        {
            loop(10);
        }
    };
}

这会将 test 更改 1、10 次。控制台证明是正确的:

1
2
3
4
5
6
7
8
9
10

现在解决这个问题。如果我尝试使用 until() 方法,如果我没有在几秒钟内终止启动,它将变得迟钝,因为它会无限增加test

public static void main(String[] args) {
    new Repeat() {
        @Override
        public void run() {
            test += 1;
            System.out.println(test); // so I know what test currently is
        }
        {
            loop(10);
        }
    };
    new Repeat() {
        @Override
        public void run() {
            test -= 1;
            System.out.println(test);
        }
        {
            until(test == 0);
        }
    };
}

这将永远持续下去。我的假设是因为在 (test == 0) 中传递的布尔值 永远不会更新,所以,如果这是正确的,任何人都可以告诉我怎么更新呢?如果我的假设是错误的,是什么原因造成的,我该如何解决?

感谢任何人真正阅读了我“输入”的每个单词(主要是复制粘贴)。

【问题讨论】:

    标签: java loops boolean repeat evaluation


    【解决方案1】:

    您从 test = 0 开始,您的程序仅减少 test。所以在第一个 if-clause 它的 -1 他们 -2 .... 它永远不会 0

    【讨论】:

    • 其实没有。在我的代码中,首先我有一个将“test”增加到 10 的循环块,然后是应该将它减少回零的 until 块。
    • 试图使测试静态化?
    【解决方案2】:

    当您在 Java 中通过方法传递原语时,它会传递值,这意味着您只传递 truefalse,它们永远不会更新,因为它只是一个值。但是,如果您进行以下操作,它应该可以工作:

    public static abstract class Repeat {
        public void loop(int c) {
            for (int i = 0; i < c; i++) {
                run();
            }
        }
    
        public void until() {
            while (isLooping()) {
                run();
            }
        }
    
        public abstract void run();
        public abstract boolean isLooping();
    }
    

    返回您是否希望继续循环遍历isLooping() 将允许您更新您的布尔值。

    【讨论】:

    • 我最终没有直接使用你的答案,但它最终让我走上了正确的道路来找到我的解决方案。谢谢!
    【解决方案3】:

    执行until(test == 0);test == 0 的值为false。因此,您将false 传递给until(),而在until() 内部,!c 的值因此为真并且永远不会改变。

    您似乎认为将布尔表达式传递给方法会使该方法在每次评估 c 时重新评估表达式。这不是它的工作原理。在调用该方法之前计算表达式,并传递该表达式的

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多