我的一位同事决定像这样声明一些API代码:
public interface Filter<T> {
/**
* Test whether the given input is valid.
* @param input the input
* @return null for neutral, {@code Boolean.TRUE} for accepted and {@code Boolean.FALSE} for rejected.
*/
Boolean apply(T input);
}
这个想法引发了对IRC的战争。虽然一些人主张使用布尔方法,但另一些人认为这是一种糟糕的做法,应该使用三个元素的枚举来表示个体状态,如下所示:
public interface Filter<T> {
Result apply(T input);
enum Result {
ACCEPT, UNKNOWN, DENIED;
}
}
那么,在性能、可读性、可维护性方面,或者,如果真的重要的话,在代码更少的情况下,生产中的最佳实践是什么
编辑:这里,@erickson的意思是接受、未知(或中立)、拒绝(或否认)。如果你感到困惑,请参考他的答案。
在回答“搁置”时,我澄清我的问题主要涉及:*是否有明确的惯例?*这是接受答案的原因
作为一般的编程建议,至少对Java
基本上,如果你这么做,你将违反你向方法的消费者公开的契约(接口)。该接口自豪地声明“将有一个值,它将是一个布尔值!”但是你的实现将是谎言!错误的如果你想暴露一些东西的缺失,只需选择可选的(Java8或番石榴!)。这可能会降低代码的可读性,但它会安全且可测试:-)
回到你的问题,枚举听起来是一个很好的干净的解决方案。对于使用应用编程接口的人来说,这将是有意义的,它将提高可测试性和可读性!
在过滤应用中,三元值的使用是公认的。更多时候,您会看到名为“接受”、“拒绝”和“中立”的选项。这在短路过滤链时非常有用。然而,这些机制不使用null
来表示中立
。
相反,使用三值枚举
会给您带来更多的实用性。
值可以有方法。每个值的实现可以不同,或者它可以是一个常见的实现,工作方式有点像Visitor
模式。如果您使用Boolean
和null
,您就不能提供自定义的方法,即使您可以扩展Boolean
,您也不能扩展null
。
与许多Map
实现不接受的null
相比,可以更容易地将enum
值用作映射中的键。这对于按状态为处理程序设置密钥非常有用。
您可以在switch语句中使用enum
值,编译器可以帮助您确保涵盖了所有选项。如果在If-else-If-else的级联中未能处理true、false和null,
编译器将不会注意到。
最后,您应该在函数接口上使用@keytionalInterface
注释。如果您不小心添加了另一个抽象方法,或者做了任何其他使您的类型不适合函数使用的事情,它会导致编译器抱怨。
最小惊讶原则建议只对true/false
使用布尔值,对任何其他对象使用enum
s,如{Trueish,Falsish,Undedecish}
。此外,与布尔值
不同,您实际上可以记录枚举
的值,这样就可以立即清楚地看到该MyEnum是什么。Truieish实际上是指在应用程序的上下文中。
问题内容: 我有一个值列表,需要根据给定的布尔值列表中的值进行过滤: 我使用以下行生成一个新的过滤列表: 结果是: 这条线工作正常,但是(对我而言)看起来有点过大了,我想知道是否有更简单的方法来实现这一目标。 忠告 以下答案提供了两个好的建议: 1-不要像我一样命名列表,因为它是内置函数。 2-不要比较像我做的事情,因为这是不必要的。只需使用就足够了。 问题答案: 您正在寻找: 时序比较(py3.
问题内容: 这可能只是白痴,但对我来说有点混乱: 为什么在返回时返回? 问题答案: 您正在根据布尔值的文字值检查它。一样不会是真的。 如果将其投射,您将看到区别: 究其原因是真实的,因为你是比较相同的对象。与或相同。 当您看到类似的东西并且此检查从未通过时,困难就来了。那是因为您正在检查项目的 真实值 。按照惯例,所有这些项目都将通过布尔检查失败- 也就是说,它们的布尔值将为: (明显) 任何空序
问题内容: 如何检查布尔值是否为null?因此,如果我知道“ hideInNav”为空。如何阻止它进一步执行?像下面这样的东西似乎不起作用,但是为什么呢? 问题答案: 只能是或因为它是原始数据类型(+ 变量的默认值为)。如果要使用值,则可以改用类。布尔是一种引用类型,这就是您可以分配给布尔“变量”的原因。例:
问题内容: 所以我有一个关于考试作业的问题,在这个作业中,我们有一堆布尔表达式,例如: 然后,我们应该编写布尔表达式的值。为此,我使用了三值逻辑,但是当您获得如下所示的布尔表达式时,这将如何应用: 或者 通过三值逻辑可以很容易地找到第一个,但是我如何找出另外两个。 我知道这是一个非常基本的问题,但是我对此仍然是陌生的。 提前致谢 问题答案: 您需要布尔值和的三相真值表: 该表是缩写,依赖于布尔逻辑
检查给定的参数是否是一个原生的布尔值。 使用 typeof 来检查一个值是否为一个布尔值。 const isBoolean = val => typeof val === 'boolean'; isBoolean(null); // false isBoolean(false); // true
我需要一个可以在junit 方法中调用的方法,该方法比较两个布尔值以检查它们是否相等,并返回一个布尔值。例如,类似这样的事情: 如果不相等,则返回false,如果相等,则返回true。我已经检查了布尔类,但是唯一接近的是< code>Boolean.compare(),它返回一个int值,我不能使用这个值。