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

在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 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中的私有枚举,公共常量反映了三种可能的状态。