用布尔运算符实现三值逻辑运算?

Sim*_*nzi 2 java logic

我创建了一个枚举类命题,其中包含三个可能的常量,

public enum Proposition {

    TRUE, FALSE, NULL;

} 
Run Code Online (Sandbox Code Playgroud)

我想做到这一点,当我使用布尔运算符编写代码时

Proposition propA = Proposition.FALSE;

Proposition propB = Proposition.NULL;

Proposition propC = propA && propB;
Run Code Online (Sandbox Code Playgroud)

按照 Kleene 的逻辑,propC 将变为 NULL。https://en.wikipedia.org/wiki/Three-valued_logic

我将如何在 Java 中实现它?我必须使用方法还是可以使用布尔运算符?

ern*_*t_k 5

您可以使用枚举方法自己实现这一点(类似于我们从 中得到的Predicate);Java 中的运算符不能被覆盖。这是一个例子:

enum Proposition {
    TRUE(Boolean.TRUE),
    FALSE(Boolean.FALSE),
    NULL(null) {
        @Override
        public Proposition and(Proposition other) {
            return this;
        }

        @Override
        public Proposition or(Proposition other) {
            return this;
        }
    };

    private final Boolean value;
    Proposition(Boolean value) {
        this.value = value;
    }

    public Proposition and(Proposition other) {
        if (NULL == other) return NULL;
        return of(this.value && other.value);
    }
    public Proposition or(Proposition other) {
        if (NULL == other) return NULL;
        return of(this.value || other.value);
    }

    public static Proposition of(Boolean bool) {
        return null == bool ? NULL : (bool ? TRUE : FALSE);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是与您的示例相对应的调用:

Proposition propA = Proposition.FALSE;
Proposition propB = Proposition.NULL;

Proposition propC = propA.and(propB);
System.out.println(propC); // NULL
Run Code Online (Sandbox Code Playgroud)

换句话说,调用.or()方法 for||.and()方法 for &&