2010-12-09 5 views
1

Как я могу разделить три разных случая в зависимости от всех трех состояний, которые могут иметь свойство Boolean? Java-код для этого выглядит просто:Скорость: три-состояние Проверка булевой способности

public class Foo { 
    public Boolean getBool() { return null /* this would be dynamic in RL */; } 
} 

// somewhere in the servlet code: 
    if (foo.getBool() == null) { 
     resp.getWriter().print("not yet set"); 
    } else if (foo.getBool()) { 
     resp.getWriter().print("set to TRUE"); 
    } else { 
     resp.getWriter().print("set to FALSE"); 
    } 

Velocity, кажется, эпически неудача здесь, поскольку спецификация не имеет нулевой буквальную и проверяет булево/не-нулевое равенство несколько заменимые для простоты. Конечно, есть два решения, чтобы избежать этой дилеммы (см. Ниже), но есть ли какой-то простой/более чистый способ?

  1. просто добавить дополнительный поглотитель к классу Foo, как так:

    булево isBoolSet() {вернуться getBool() = NULL;! }

и код VTL затем будет:

#if(!$foo.boolSet) 
    not yet set 
#else 
    #if($foo.bool) 
    set to TRUE 
    #else 
    set to FALSE 
    #end 
#end 
  1. принести некоторое нулевое значение, так как,

    Объект getTheNull() {возвращение нуль; }

и VTL тогда будет выглядеть так:

#if($foo.bool == $foo.theNull) 
    not yet set 
#else 
    #if($foo.bool) 
    set to TRUE 
    #else 
    set to FALSE 
    #end 
#end 
+1

Ну, я думаю, что это будет менее эффективная скорость, но в конечном итоге было бы намного безопаснее и чище использовать тип перечисления ... – 2010-12-09 22:11:04

+0

Каким образом это было бы менее эффективно? Почти наверняка более эффективно. – 2010-12-09 22:15:21

+1

Ну, я знаю, что использование типов перечислений не рекомендуется на таких платформах, как Android, потому что оно медленнее, чем прямые числовые значения. Я не уверен в разнице скоростей между ними в нормальной среде Java, но, возможно, это похоже, хотя разница в конечном итоге не такая резкая. – 2010-12-10 01:08:15

ответ

4

Если вы используете современную версию Velocity, вы можете просто использовать $ null или $ anyReferenceThatHasNoValue. Вы можете также использовать #elseif упростить вещи:

#if($foo.bool == $null) 
    not yet set 
#elseif($foo.bool) 
    set to TRUE 
#else 
    set to FALSE 
#end 

А если серьезно, это хак каким-либо образом вы его фрагмент. Вы должны использовать перечисление.

1
!$foo.bool && $foo.bool != false 

эквивалентно

$foo.bool == $null (in Velocity 1.6 onwards) 

Я предполагаю, что это всего лишь о поздней ночи кодирования и несколько несвежим/минималистичный Velocity Руководство пользователя ...

+1

вы, вероятно, хотели сказать `! $ Foo.bool && ...` – serg 2010-12-09 22:16:09

2

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

Дайте себе перечислить, тогда вы можете прямо сказать, что это NOT_READY. Явный - это хорошо. Несколько дополнительных строк кода над комментариями являются удивительными.

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

Просто продолжайте и делайте это.

0

Почему вы не инициализируете свой Boolean внутри конструктора? Таким образом, он никогда не будет пустым