用布尔运算符实现三值逻辑运算?
Implementing a three-valued logic operation with Boolean operators?
我创建了一个枚举 class 具有三个可能常量的命题,
public enum Proposition {
TRUE, FALSE, NULL;
}
而且我想这样做,当我使用布尔运算符编写代码时
Proposition propA = Proposition.FALSE;
Proposition propB = Proposition.NULL;
Proposition propC = propA && propB;
propC 将变为 NULL,遵循 Kleene 的逻辑。 https://en.wikipedia.org/wiki/Three-valued_logic
我将如何在 Java 中实现它?我必须使用方法还是可以使用布尔运算符?
您可以使用枚举方法自行实现(类似于我们从 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);
}
}
这是与您的示例对应的调用:
Proposition propA = Proposition.FALSE;
Proposition propB = Proposition.NULL;
Proposition propC = propA.and(propB);
System.out.println(propC); // NULL
换句话说,||
调用.or()
方法,&&
调用.and()
方法。
我创建了一个枚举 class 具有三个可能常量的命题,
public enum Proposition {
TRUE, FALSE, NULL;
}
而且我想这样做,当我使用布尔运算符编写代码时
Proposition propA = Proposition.FALSE;
Proposition propB = Proposition.NULL;
Proposition propC = propA && propB;
propC 将变为 NULL,遵循 Kleene 的逻辑。 https://en.wikipedia.org/wiki/Three-valued_logic
我将如何在 Java 中实现它?我必须使用方法还是可以使用布尔运算符?
您可以使用枚举方法自行实现(类似于我们从 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);
}
}
这是与您的示例对应的调用:
Proposition propA = Proposition.FALSE;
Proposition propB = Proposition.NULL;
Proposition propC = propA.and(propB);
System.out.println(propC); // NULL
换句话说,||
调用.or()
方法,&&
调用.and()
方法。