2

我有一个特殊的问题。我使用 Thrift,后端使用 java,前端使用 php。我们有一种情况,我要求用户输入三个变量的布尔值。用户可以将它们设置为 true 或 false,或者根本不设置它们。在后端,我将这三个值存储为 char(1) 字节的三位。当我检查时,在初始化时,Thrift 默认为这些变量分配一个 false 值。

我面临的问题是,我想知道用户何时根本不触摸(设置或取消设置)特定的布尔值。我的很多位操作都依赖于此。我不想为此在用户端进行更改,而是自己处理。

4

4 回答 4

3

对于这类问题,您应该使用用户定义的数据类型,即枚举。

定义可以保存三个值的枚举 =>(TRUE、FALSE 和 NOT_SET)

这将解决您的问题

于 2012-12-28T09:24:19.620 回答
0

要在 java 中处理三态布尔值,您有几个选项。

  • 使用布尔对象:null表示它未设置
  • 使用和 int:1为真,'0' 为假,'-1' 为未设置
  • 在布尔值旁边使用附加标志来表示未设置

注意:从 Java 5 开始,您甚至可以对第一个选项使用自动装箱,如下所示:

Boolean myFlag = null;

if (myFlag==null) {
    // unset
}
else if (myFlag) {
    // true
}
else {
    // false
}
于 2014-09-11T08:51:13.413 回答
0

如果没有为变量定义任何内容,则问题是 Thrift,Thrift 默认为 optinReqOut(可选输入,必需输出)。因此,当您反序列化时,它会将其视为缺失并设置默认值。

明确地使变量可选。

https://twitter.github.io/scrooge/Semantics.html

于 2015-11-17T05:16:25.823 回答
0

它似乎在 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;
}
于 2021-01-06T15:21:31.500 回答