我有一个特殊的问题。我使用 Thrift,后端使用 java,前端使用 php。我们有一种情况,我要求用户输入三个变量的布尔值。用户可以将它们设置为 true 或 false,或者根本不设置它们。在后端,我将这三个值存储为 char(1) 字节的三位。当我检查时,在初始化时,Thrift 默认为这些变量分配一个 false 值。
我面临的问题是,我想知道用户何时根本不触摸(设置或取消设置)特定的布尔值。我的很多位操作都依赖于此。我不想为此在用户端进行更改,而是自己处理。
我有一个特殊的问题。我使用 Thrift,后端使用 java,前端使用 php。我们有一种情况,我要求用户输入三个变量的布尔值。用户可以将它们设置为 true 或 false,或者根本不设置它们。在后端,我将这三个值存储为 char(1) 字节的三位。当我检查时,在初始化时,Thrift 默认为这些变量分配一个 false 值。
我面临的问题是,我想知道用户何时根本不触摸(设置或取消设置)特定的布尔值。我的很多位操作都依赖于此。我不想为此在用户端进行更改,而是自己处理。
对于这类问题,您应该使用用户定义的数据类型,即枚举。
定义可以保存三个值的枚举 =>(TRUE、FALSE 和 NOT_SET)
这将解决您的问题
要在 java 中处理三态布尔值,您有几个选项。
null
表示它未设置1
为真,'0' 为假,'-1' 为未设置注意:从 Java 5 开始,您甚至可以对第一个选项使用自动装箱,如下所示:
Boolean myFlag = null;
if (myFlag==null) {
// unset
}
else if (myFlag) {
// true
}
else {
// false
}
如果没有为变量定义任何内容,则问题是 Thrift,Thrift 默认为 optinReqOut(可选输入,必需输出)。因此,当您反序列化时,它会将其视为缺失并设置默认值。
明确地使变量可选。
它似乎在 Java 中工作:我在 IDL 文件中定义了一个名为 flag 的变量,如下所示:
optional bool flag;
我在这样的 Java 类文件中使用它:
if (request.isSetFlag()) {
boolean flag = request.isFlag();
if (flag) {do something when flag is true;}
else {do something when flag is false;}
}else{
do something when flag is null;
}