2017-01-12 5 views
2

Я ищу лучший способ реализации трехзначной логики.Лучший способ использования трехзначных логических переменных

Я гугле и нашел три различных подхода:

  1. Используйте null значение для Boolean переменной как неопределенную

    Этот вариант выглядит опасным для меня, потому что это может неожиданно вызвать NullPointerException

  2. Использование Optional<Boolean> тип

    Этот вариант все же немного опасен. Чтобы избежать NoSuchElementException следует использовать конструкции, как это:

    Optional<Boolean> amIRight = Optional.empty(); 
    if (Optional.of(true).equals(amIRight) { 
        doSome(); 
    } 
    

    Это выглядит слишком многословным для меня

  3. Реализовать свой собственный перечисление

    Последний вариант кажется лучшим. Почти безопасно, очень просто в неподтвержденном состоянии. Но я не нашел ни одного из таких перечислений в широко распространенных джавахских лириках, таких как Apache, Google Guava и т. Д. Мне кажется странным, что все избегают более простой и безопасной реализации.

    Может быть, я пропустил что-то, и есть серьезные причины не применять трехзначное логическое перечисление.

+0

Перейти с перечислением. – shmosel

+0

1. enums все еще может быть «null», поэтому он не отличается от использования 'Boolean', 2. для' Optional' использование 'someOptional.orElse (false)' короче и легче читать, чем ваш текущее «решение». –

+0

@MarkRotteveel Null - не главное. Дело в том, что булевы не должны быть [tri-state] (http://thedailywtf.com/articles/What_Is_Truth_0x3f_). – shmosel

ответ

2

Я согласен с тем, что перечисления являются, безусловно, самым безопасным и лучшим решением вашей проблемы. Возможно, перечисления не широко используются в таких проектах, как Apache, потому что перечисления относительно новы в Java (я думаю, они пришли в Java 1.5).

+3

(Новинка: нет, Java 1.5 с 2004 года) – PeterMmm

+0

«относительно» новый. Я все еще сталкиваюсь с множеством Java-API, которые были первоначально написаны до Java 1.5, и не потратили время/усилия на переход на использование перечислений. Ладно, может быть, я позвоню в enums, чтобы показать мой возраст немного. Я использую Java с 1,2 дня :) –

3

Если перечисление работает на вас, идите к нему.
Не используйте, что Boolean, это некрасиво и уничтожить читаемость ... Я также не могу себе представить, как ужасно было бы, если вы хотите, чтобы поддержать 4 значения позже ...

Других мер предосторожности/посоветуйте :

Вы уверены, что будете использовать только 3 значения?
Во многих ситуациях дизайн имеет тенденцию к изменению, и перечисление будет уже недостаточно.
Использование класса, инкапсулирующего enum (или int), может обеспечить большую гибкость.
Однако вы можете перейти с перечисления на класс позже.

В моей программе я широко использую перечисление.
Вы не должны заботиться о том, что делают популярные библиотеки, просто выберите лучшее, что работает для вас!

О очень интересную гипотезу:

... есть серьезная причина не выполнять трехзначной логики перечисления. ...

Предположим, что я разработчик языка Java.
Вы запрашиваете 3-logic enum.
Я принимаю предложение.

Тогда Mr.2D спросить: «У нас есть 3-logic enum. Почему бы вам не предоставить 4-logic enum для поддержки +x -x +y -y?».
Я даю ему то, что он хочет.

После этого Mr.LoveFiveMr.ObsessiveSick ..... Я думаю, вы поняли.

Должен быть порог (когда остановиться), а требование для 3-enum относительно невелико по сравнению с 2-перечислением (булево).

0

Если вы хотите 3-значную логику, вы больше не говорите о простых истинных/ложных условиях, вы говорите о машине состояния. Вероятно, государственные машины являются одними из самых сильных парадигм в программировании. Если вы не знакомы с теорией автоматов, посмотрите.

Смежные вопросы