Как узнать, не было ли булево значение (или не установлено) вообще?

У меня есть своеобразная проблема. Я работаю с Thrift с java на бэкэнд и [PHP](/tag5740) на лицевой стороне. У нас есть ситуация, когда я запрашиваю у пользователя логическое значение для трех переменных. Пользователь может либо установить их в true, либо false или вообще не устанавливать их. На бэкэнд я сохраняю эти три значения как три бита байта char (1). Когда я проверил, после инициализации Thrift присваивает значение false по умолчанию этим переменным.

Проблема, с которой я столкнулся, заключается в том, что я хочу знать, когда пользователь не прикасается (устанавливал или не устанавливал) конкретное логическое значение вообще. От этого зависит много моих манипуляций. Я не хочу вносить изменения в пользовательскую часть для этого и, скорее, обрабатывать его самостоятельно.

Для этих проблем вы должны использовать пользовательские типы данных, например, перечисления.

Define enums which can hold three value => (TRUE, FALSE and NOT\_SET)

Это решит вашу проблему



Для обработки булевых состояний tri-state в java у вас есть несколько вариантов.

* использовать Boolean object:  `null`  означает, что он не установлен
* use и int:  `1`  для true, '0' для false и '-1' для unset
* используйте дополнительный флаг рядом с логическим значением для сигнала unset

примечание: поскольку Java 5 вы можете использовать автобоксинг для первого варианта, например:

```
Boolean myFlag = null;

if (myFlag==null) {
   //unset
}
else if (myFlag) {
   //true
}
else {
   //false
}

```



Проблема - это Thrift, если для переменной не указано ничего, Thrift по умолчанию optinReqOut (Необязательный В, Требуемый выход). Поэтому, когда вы десериализуетесь, он видит его как отсутствующий и устанавливает значение по умолчанию.

Явно сделайте переменные необязательными.

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