1
boolean allValid = true;
for (FormEditText field: allFields) {
    allValid = field.testValidity() && allValid;
}

我想allValid只有true当每个都field.testValidity为真时,但这种陈述是如何被调用的或者它是如何工作的?

4

8 回答 8

5

当且仅当 的所有结果都为真时,将变量设置为真是一种相当神秘且浪费的方式field.testValidity()

我更喜欢以下内容,因为它更有效;除非由于某种原因需要在集合中的每个项目上调用 testValidity() (在这种情况下,该函数确实应该重命名):

boolean allValid = true;
for (FormEditText field: allFields) {
    if (!field.testValidity()){
        allValid = false;
        break;
    }
}
于 2013-07-05T08:43:54.073 回答
1

你的假设是正确的。如果右侧的任一表达式的计算结果为false,则AND( &&) 的计算false结果为 ,并且该结果将用于一次迭代。因此任何false都会导致false结果。

您可能会争辩说,您可以在遇到 a 时立即跳出循环false(前提testValidity()是没有副作用),但这实际上可能会以牺牲一些(也许可以忽略不计的)性能提升为代价而使这个循环的功能变得模糊。在大多数情况下,我更喜欢清晰而不是效率

于 2013-07-05T08:41:42.393 回答
0

false如果有任何field.testValidity原因false,它会转向false AND x = false

所以它必须是true所有它们+初始值(true在这段代码中)true在循环之后

于 2013-07-05T08:40:57.930 回答
0

allValidtrue当所有字段都有效时。

&&行为是这样的,如果其中一个论点是false,答案将是false.

如果您有 3 个字段,那么发生的情况是:

allValid = field3Valid && (field2Valid && field1Valid);

因此,如果任何字段被证明是无效的,那么allValid将是false.

如果字段 2 无效,则:

allValid = true && (false && true);  // ---> true && (false) ----> false

正如@Bathsheba 的回答所指出的那样,这就是它的工作方式并且效率低下。

于 2013-07-05T08:41:44.593 回答
0

在循环中,只要 field.testValidity() 返回 true,allValid 将保持为 true。一旦 field.testValidity() 返回 false,allValid 将变为 false 并保持为 false。

这是因为 false && true = false。

于 2013-07-05T08:41:58.983 回答
0

从代码来看,该代码似乎用于检查allFields变量中存在的所有字段是否都通过了验证。

在这种情况下,我们可以修改代码,如果其中一个字段无效,那么我们可以break循环。

于 2013-07-05T08:44:02.490 回答
0

for (FormEditText field: allFields)表示 foreach fieldin allFieldscheck field.testValidity() AND allValid。因此,如果在任何支票中field.testValidity()返回false,那么allValid将是false.

于 2013-07-05T08:46:02.590 回答
0

正如该字段的名称所暗示的那样,当且仅当所有表单字段都有效时,allValid才会为真,否则在退出循环时它将为假。如果至少有一个表单字段无效,它将是错误的。

我认为这是智能编写的代码,对于那些不习惯布尔算术的人来说,这会显得晦涩难懂。如果我必须这样做,我也会这样写,但会附上一些解释意图的评论。

于 2013-07-05T09:10:32.597 回答