当前位置: 首页 > 知识库问答 >
问题:

在过滤过程中,给空值加上两个布尔值来表示三值balue是否合适?[闭门]

汝彭薄
2023-03-14

我的一位同事决定像这样声明一些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的意思是接受、未知(或中立)、拒绝(或否认)。如果你感到困惑,请参考他的答案。

在回答“搁置”时,我澄清我的问题主要涉及:*是否有明确的惯例?*这是接受答案的原因


共有3个答案

卫志泽
2023-03-14

作为一般的编程建议,至少对Java

基本上,如果你这么做,你将违反你向方法的消费者公开的契约(接口)。该接口自豪地声明“将有一个值,它将是一个布尔值!”但是你的实现将是谎言!错误的如果你想暴露一些东西的缺失,只需选择可选的(Java8或番石榴!)。这可能会降低代码的可读性,但它会安全且可测试:-)

回到你的问题,枚举听起来是一个很好的干净的解决方案。对于使用应用编程接口的人来说,这将是有意义的,它将提高可测试性和可读性!

戚衡
2023-03-14

在过滤应用中,三元值的使用是公认的。更多时候,您会看到名为“接受”、“拒绝”和“中立”的选项。这在短路过滤链时非常有用。然而,这些机制不使用null来表示中立

相反,使用三值枚举会给您带来更多的实用性。

值可以有方法。每个值的实现可以不同,或者它可以是一个常见的实现,工作方式有点像Visitor模式。如果您使用Booleannull,您就不能提供自定义的方法,即使您可以扩展Boolean,您也不能扩展null

与许多Map实现不接受的null相比,可以更容易地将enum值用作映射中的键。这对于按状态为处理程序设置密钥非常有用。

您可以在switch语句中使用enum值,编译器可以帮助您确保涵盖了所有选项。如果在If-else-If-else的级联中未能处理true、false和null,编译器将不会注意到。

最后,您应该在函数接口上使用@keytionalInterface注释。如果您不小心添加了另一个抽象方法,或者做了任何其他使您的类型不适合函数使用的事情,它会导致编译器抱怨。

司寇瑾瑜
2023-03-14

最小惊讶原则建议只对true/false使用布尔值,对任何其他对象使用enums,如{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值,我不能使用这个值。