скорость: проверка булевых свойств в трех состояниях - PullRequest
1 голос
/ 10 декабря 2010

Как мне разветвить три разных случая в зависимости от всех трех состояний, которые может иметь логическое свойство?Код 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");
    }

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

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

    boolean isBoolSet () {return getBool ()! = Null;}

, и тогда код VTL будет:

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

    Object getTheNull () {return null;}

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

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

Ответы [ 4 ]

4 голосов
/ 10 декабря 2010

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

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

А если серьезно, то это хак, если ты его нарезаешь. Вы должны использовать enum.

2 голосов
/ 10 декабря 2010

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

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

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

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

1 голос
/ 10 декабря 2010
!$foo.bool && $foo.bool != false

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

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

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

0 голосов
/ 10 декабря 2010

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

...