通过滥用包装在 if 语句中的三元元进行的条件方法调用



最近我在做代码审查,遇到了这个人:

if(!sharePermission.isExpired() ? activePermissions.add(sharePermission) : expiredPermissions.add(sharePermission));

基本上使用三元表达式调用返回布尔值的方法并将其包装在if(...)语句中,以满足成为独立语句的要求。这是否比

if(!sharePermission.isExpired())
   activePermissions.add(sharePermission); 
else 
   expiredPermissions.add(sharePermission); 

如果你真的需要将代码压缩到一行?当包装在if(...)中时,是否为从三元表达式返回的值分配了任何类型的额外空间?

我不是他们中的任何一个的粉丝,只是好奇。

这样做

是对if语句的滥用,更不用说条件表达式了。

编写完整的 if 语句或使用条件运算符选择要添加到的列表会更干净:

List<Permission> list = isExpired() ? expiredPermission : activePermission;
list.add(sharePermission);

没有发生作业,只有对boolean条件的评估。不会为评估结果分配额外的内存。

然而,使用三元表达式来模拟三元语句是非常不正统的。它将降低代码的可读性,而不会带来任何额外的好处。因此,使用带有else的普通if是更好的选择。

请注意,如果 activePermissionsexpiredPermissions 属于同一类型,则可以使用三元表达式在add调用的目标之间做出决定,如下所示:

(sharePermission.isExpired() ? expiredPermissions : activePermissions).add(sharePermission);

您正在寻找的if..else的三元等价物是这样的 -

(!sharePermission.isExpired() ? activePermissions : expiredPermissions).add(sharePermission); // no if here

相当于

if(!sharePermission.isExpired()) {
    activePermissions.add(sharePermission); 
}
else {
    expiredPermissions.add(sharePermission);
}