Pergunta

Como faço para gastar três casos diferentes, dependendo de todos os três estados que a propriedade booleana pode ter? O código Java para isso parece simples:

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");
    }

A velocidade parece falhar epicamente aqui, pois as especificações não possuem verificações nulas de igualdade literal e booleana/não nula são um tanto fungíveis em prol da simplicidade. Obviamente, há duas soluções para evitar esse dilema (veja abaixo), mas há alguma maneira direta/limpa?

  1. Basta adicionar um getter extra à aula Foo, assim:

    boolean isboolset () {return getBool ()! = null; }

e o código VTL seria então:

#if(!$foo.boolSet)
  not yet set  
#else
  #if($foo.bool)
    set to TRUE
  #else
    set to FALSE  
  #end
#end
  1. buscar algum valor nulo, assim,

    Objeto getThenull () {return null; }

E o VTL então seria:

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

Solução

Se você usar uma versão moderna do Velocity, basta usar $ null ou $ anyreferencethathasnovalue. Você também pode usar #Elseif para simplificar as coisas:

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

Mas, falando sério, isso é um hack da maneira que você o cortar. Você deve estar usando um enumeração.

Outras dicas

Sempre que tentei calçar algo em que não se encaixava, sempre acabei me arrependo não apenas me mudar para o estado mais apropriado em primeiro lugar.

Dê a si mesmo uma enumeração, então você pode dizer explicitamente que não é_ready. Explícito é bom. Algumas linhas extras de código sobre comentários são impressionantes.

Outro exemplo disso é-se você já se perguntou sobre criar uma nova classe ou colocar mais código em uma classe existente, provavelmente precisará de 2 ou 3 novas classes.

Apenas vá em frente e faça isso.

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

é equivalente a

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

Eu acho que é tudo sobre codificação noturna e guia de usuário de velocidade um tanto obsoleto/minimalista ...

Por que você não inicializa seu booleano dentro do construtor? Dessa forma, nunca será nulo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top