Velocidade: verificação de propriedade booleana tri-estadual
-
25-09-2019 - |
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?
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
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
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