Java 在过滤过程中,将null与两个布尔值一起表示三值balue是否好?

Java 在过滤过程中,将null与两个布尔值一起表示三值balue是否好?,java,Java,我的一位同事决定声明一些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.

我的一位同事决定声明一些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);
}
public interface Filter<T> {
    Result apply(T input);
    enum Result {
        ACCEPT, UNKNOWN, DENIED;
    }
}
那么,在性能、可读性、可维护性方面,或者,如果真的很重要的话,更少的代码方面,生产中的最佳实践是什么

编辑:这里,@erickson的意思是接受、未知(或中立)、拒绝(或拒绝)。如果你对gpt感到困惑,如果你感到困惑,请参考他的答案

在回答“暂停”问题时,我澄清我的问题主要涉及:
*有没有一个明确的惯例?*这就是被接受的anwser的原因

建议只对
真/假
使用布尔值,而对其他任何东西,如
{Trueish,Falsish,undecish}
使用
枚举
。此外,与
Boolean
不同,您可以实际记录
enum
的值,这样就可以立即清楚地看出
MyEnum.truieiish
在您的应用程序上下文中的实际含义。

建议仅对
真/假
使用Boolean,对任何其他内容使用
enum
s,例如
{Trueish,Falsish,Undecideish}
。此外,与布尔值不同,您可以实际记录
枚举值,以便立即清楚地知道
MyEnum.Truieish
在您的应用程序上下文中的实际含义。

在过滤应用程序中使用三元值是很好的。更多时候,您会看到名为ACCEPT、DENY和NEUTRAL的选项。这在短路过滤器链时非常有用。但是,这些机制不使用
null
来表示
中性

相反,使用三值
枚举
可以提供更多的实用性

值可以有方法。每个值的实现可能不同,也可能是一个类似于
Visitor
模式的常见实现。如果使用
Boolean
null
,则无法提供自定义方法,即使可以扩展
Boolean
,也无法扩展
null

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

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


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

在过滤应用程序中使用三值是很常见的。更多时候,您会看到名为ACCEPT、DENY和NEUTRAL的选项。这在短路过滤器链时非常有用。但是,这些机制不使用
null
来表示
中性

相反,使用三值
枚举
可以提供更多的实用性

值可以有方法。每个值的实现可能不同,也可能是一个类似于
Visitor
模式的常见实现。如果使用
Boolean
null
,则无法提供自定义方法,即使可以扩展
Boolean
,也无法扩展
null

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

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


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

作为一般编程建议,至少对Java和Scala而言,决不,决不,决不使用null作为返回值,尤其是在编写公共API时

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


回到您的问题上来,enum听起来是一个很好且干净的解决方案。这对使用API的用户来说是有意义的,它将提高可测试性和可读性

作为一般编程建议,至少对于Java和Scala,永远不要使用null作为返回值,尤其是在编写公共API时

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

回到您的问题上来,enum听起来是一个很好且干净的解决方案。这对使用API的用户来说是有意义的,它将提高可测试性和可读性

:p用于re的枚举