Java—将三值逻辑表示为数据类型
在University的演讲中,我必须用Java编写一个三值逻辑(真、假、未知)。到目前为止,我有:Java—将三值逻辑表示为数据类型,java,logic,Java,Logic,在University的演讲中,我必须用Java编写一个三值逻辑(真、假、未知)。到目前为止,我有: public class TriLogic { public enum Logic { TRUE, FALSE, UNKNOWN } public Logic Disj(Logic op1, Logic op2){ } public Logic Neg (Logic op1){ } public Logic
public class TriLogic {
public enum Logic {
TRUE, FALSE, UNKNOWN
}
public Logic Disj(Logic op1, Logic op2){
}
public Logic Neg (Logic op1){
}
public Logic Conj(Logic op1,Logic op2){
}
}
注意:我们的任务不是实际实现函数中的逻辑
这个类理论上应该用否定、析取和连接三种方法来表示三值逻辑。然而,我不能100%确定它是否正确。因此,我想听听第二种意见。这行得通吗?行得通,但不太“正确”。您的
TriLogic
类应该有一个final Logic
不可变成员变量,并且方法应该少一个参数;每个操作的结果都是TriLogic变量与methods参数的组合。(Neg
将是变量的简单求反)。这将允许您这样做
Logic false = true.Neg();
该类的构造函数留给读者作为练习 它会起作用,但不太“正确”。您的
TriLogic
类应该有一个final Logic
不可变成员变量,并且方法应该少一个参数;每个操作的结果都是TriLogic变量与methods参数的组合。(Neg
将是变量的简单求反)。这将允许您这样做
Logic false = true.Neg();
该类的构造函数留给读者作为练习 您可以做的一件事是取消整个
TriLogic
类,并将您的方法放在enum
本身中:
public enum Logic {
TRUE {
@Override
public Logic disj(Logic op) {}
@Override
public Logic neg() {}
@Override
public Logic conj(Logic op) {}
},
FALSE {
@Override
public Logic disj(Logic op) {}
@Override
public Logic neg() {}
@Override
public Logic conj(Logic op) {}
},
UNKNOWN {
@Override
public Logic disj(Logic op) {}
@Override
public Logic neg() {}
@Override
public Logic conj(Logic op) {}
};
public abstract Logic disj(Logic op);
public abstract Logic neg();
public abstract Logic conj(Logic op);
}
是的,打字要多得多。不过,这是可行的。实际上我更喜欢这样,因为您不需要执行if-else检查和/或切换逻辑方法,而且使用起来也更方便(例如TRUE.neg().conj(FALSE);
)。你的电话。您还可以添加静态方法来操作两个逻辑值,但这是可选的。事实上,现在我想起来了,静态方法将非常容易实现:
public static Logic disj(Logic op1, Logic op2) { return op1.disj(op2);}
您可以做的一件事是取消整个TriLogic
类,并将您的方法放在enum
本身中:
public enum Logic {
TRUE {
@Override
public Logic disj(Logic op) {}
@Override
public Logic neg() {}
@Override
public Logic conj(Logic op) {}
},
FALSE {
@Override
public Logic disj(Logic op) {}
@Override
public Logic neg() {}
@Override
public Logic conj(Logic op) {}
},
UNKNOWN {
@Override
public Logic disj(Logic op) {}
@Override
public Logic neg() {}
@Override
public Logic conj(Logic op) {}
};
public abstract Logic disj(Logic op);
public abstract Logic neg();
public abstract Logic conj(Logic op);
}
是的,打字要多得多。不过,这是可行的。实际上我更喜欢这样,因为您不需要执行if-else检查和/或切换逻辑方法,而且使用起来也更方便(例如TRUE.neg().conj(FALSE);
)。你的电话。您还可以添加静态方法来操作两个逻辑值,但这是可选的。事实上,现在我想起来了,静态方法将非常容易实现:
public static Logic disj(Logic op1, Logic op2) { return op1.disj(op2);}
为什么您认为它可能不正确?我正在使用Eclipse,而且它似乎(甚至我已经将它设置为使用JDK1.8)无法识别enum。您这是什么意思?另外,假设这是一个输入错误,但在UNKNOWN
枚举后缺少分号,在最后一个元素后不需要分号;逻辑枚举声明是正确的。@Dave好吧,只有当枚举中没有其他内容时才可以。如果定义方法/字段/构造函数,分号是必需的。为什么您认为它可能不正确?我使用的是Eclipse,似乎(甚至我已经将其设置为使用JDK 1.8)它无法识别enum。这是什么意思?另外,假设这是一个输入错误,但在UNKNOWN
枚举后缺少分号,在最后一个元素后不需要分号;逻辑枚举声明是正确的。@Dave好吧,只有当枚举中没有其他内容时才可以。如果定义方法/字段/构造函数,则必须使用分号。请注意这些方法如何使用逻辑参数。。。实际上,我相信这个类作为一个静态实用程序类会工作得更好。我确实注意到了这一点,这就是我建议改进的原因。它们应该是静态的(有点垃圾),或者类被重新分解以使用我的建议。静态方法有什么问题?我认为如果你要走你建议的路,你应该去掉整个TriLogic
类,把方法放在枚举中,因为对于一个只有三种可能状态的类来说,构造函数是毫无意义的。我很感激你的回答,但我认为这将超过他们希望我们通过这个异常实现的目标。无论如何谢谢你的帮助。@user3580294;实际上,我同意,它应该是TriLogic中的私有枚举,公共常量反映了三种可能的状态。。。实际上,我相信这个类作为一个静态实用程序类会工作得更好。我确实注意到了这一点,这就是我建议改进的原因。它们应该是静态的(有点垃圾),或者类被重新分解以使用我的建议。静态方法有什么问题?我认为如果你要走你建议的路,你应该去掉整个TriLogic
类,把方法放在枚举中,因为对于一个只有三种可能状态的类来说,构造函数是毫无意义的。我很感激你的回答,但我认为这将超过他们希望我们通过这个异常实现的目标。无论如何谢谢你的帮助。@user3580294;实际上,我同意,它应该是TriLogic中的私有枚举,公共常量反映了三种可能的状态。