Java boolean
permite que os valores de true
e false
enquanto booleana permite true
, false
e null
. Comecei a converter meus boolean
s em Boolean
s. Isso pode causar falhas em testes como
Boolean set = null;
...
if (set) ...
enquanto o teste
if (set != null && set) ...
parece artificial e propenso a erros.
Quando, se for o caso, é útil usar Boolean
s com valores nulos? Se nunca, então quais são as principais vantagens do objeto empacotado?
ATUALIZAÇÃO: Houve tantas respostas valiosas que resumi algumas delas em minha própria resposta. Eu sou, na melhor das hipóteses, um intermediário em Java, então tentei mostrar as coisas que acho úteis. Observe que a pergunta está "formulada incorretamente" (o booleano não pode "ter um valor nulo"), mas eu a deixei no caso de outras pessoas terem o mesmo equívoco.
Boolean
variável comonull
help.null
se ele realmente for usado como um terceiro estado.Boolean
é um objeto, enquanto aboolean
é um "escalar". Se umaBoolean
referência for definida como nula, isso significa que oBoolean
objeto correspondente não existe. Você não pode colocar nada dentro de algo que não existe.Respostas:
Use
boolean
e nãoBoolean
sempre que puder. Isso evitará muitos seNullPointerException
tornará seu código mais robusto.Boolean
é útil, por exemploMessageFormat.format()
.fonte
Boolean isSchrodingerCatAlive = null;
(desculpe, não pude resistir;)).Eu quase nunca uso
Boolean
porque sua semântica é vaga e obscura. Basicamente, você tem lógica de três estados: verdadeiro, falso ou desconhecido. Às vezes, é útil usá-lo quando, por exemplo, você deu ao usuário uma escolha entre dois valores e o usuário não respondeu nada e realmente deseja saber essas informações (pense: coluna NULLable do banco de dados).Não vejo razão para converter de
boolean
paraBoolean
, pois introduz sobrecarga de memória extra, possibilidade de NPE e menos digitação. Normalmente eu uso estranhoBooleanUtils.isTrue()
para tornar minha vida um pouco mais fácilBoolean
.A única razão para a existência de
Boolean
é a capacidade de ter coleções doBoolean
tipo (os genéricos não permitemboolean
, assim como todas as outras primitivas).fonte
Boolean.TRUE.equals(myBooleanObject)
ouBoolean.FALSE.equals(myBooleanObject)
.true
efalse
. nãonull
é um estado do objeto, mas um estado da referência do objeto.isTrue()
método ..." que soa como a coisa mais idiota da história das funções utilitárias. E, no entanto, de alguma forma, é útil ... esse é o maior peso aqui.Uau, o que diabos? Sou apenas eu ou todas essas respostas estão erradas ou pelo menos enganosas?
A classe booleana é um wrapper em torno do tipo primitivo booleano. O uso desse wrapper é capaz de transmitir um booleano em um método que aceita um objeto ou genérico. Ou seja, vetor.
Um objeto booleano nunca pode ter um valor nulo. Se sua referência a um booleano for nula, significa simplesmente que seu booleano nunca foi criado.
Você pode achar isso útil: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Boolean.java
Uma referência booleana nula deve ser usada apenas para acionar lógica semelhante à qual você tem qualquer outra referência nula. Usá-lo para lógica de três estados é desajeitado.
EDIT: aviso, isso
Boolean a = true;
é uma declaração enganosa. Isso realmente é igual a algo mais próximo deBoolean a = new Boolean(true);
Por favor, veja autobox aqui: http://en.wikipedia.org/wiki/Boxing_%28computer_science%29#AutoboxingTalvez seja daí que vem grande parte da confusão.
EDIT2: Por favor, leia os comentários abaixo. Se alguém tiver uma idéia de como reestruturar minha resposta para incorporar isso, faça-o.
fonte
Boolean a = true;
) e depois definir um como null (a = null;
). Pode não ser elegante ou sábio, mas é possível.Boolean a
; a é um ponteiro para um objeto booleano. Se vocêa = null;
não definiu seu booleano como nulo, definiu sua referência como nulo. FaçaBoolean a = null; a.booleanValue();
Neste caso, você nunca criou um objeto Boolean e, portanto, ele vai lançar um NullPointerException. Entre em contato se precisar de mais instruções.Boolean a = true;
, ele faz algum tipo de mágica que realmente é interpretada comoBoolean a = new Boolean(true);
provavelmente não está completamente correta por razões de desempenho, mas você deve perceber que o booleano ainda é um objeto.Há três razões rápidas:
true
,false
ounull
xsd:boolean
valores do esquema XML declarados comxsd:nillable="true"
List<Boolean>
- você não pode usarList<boolean>
fonte
boolean
" (estilo da mente), porque no Oracle você costuma usarchar(1) null
com os valores 'T' e 'F'. Por isso, pode (com, por exemplo, tipo de adaptador de hibernação) ser nula :)RESPOSTA À PRÓPRIA PERGUNTA: Pensei que seria útil responder minha própria pergunta, pois aprendi muito com as respostas. Esta resposta tem como objetivo ajudar aqueles - como eu - que não têm um entendimento completo dos problemas. Se eu usar um idioma incorreto, corrija-me.
true
efalse
. É a ausência de um ponteiro para objetos. Portanto, pensar que Booleano tem 3 valores é fundamentalmente erradoA sintaxe para Boolean é abreviada e oculta o fato de que a referência aponta para Objetos:
Boolean a = true;
esconde o fato de que
true
é um objeto. Outras atribuições equivalentes podem ser:ou
A sintaxe abreviada
if (a) ...
é diferente da maioria das outras atribuições e oculta o fato de que a pode ser uma referência a um objeto ou uma primitiva. Se um objeto é necessário testar para
null
evitar o NPE. Para mim, é psicologicamente mais fácil lembrar disso se houver um teste de igualdade:if (a == true) ...
onde podemos ser solicitados a testar nulos. Portanto, a forma abreviada só é segura quando
a
é primitiva.Para mim, agora tenho as recomendações:
Boolean
de um método como poderia sernull
. Apenas retorneboolean
.Boolean
para agrupar elementos em contêineres ou argumentos para métodos em que objetos são necessáriosfonte
As classes de wrapper para primitivas podem ser usadas onde os objetos são necessários, as coleções são uma boa amostra.
Imagine que você precisa para alguma loja motivo uma sequência de
boolean
em umaArrayList
, isso pode ser feito por boxeboolean
naBoolean
.Há algumas palavras sobre isso aqui
Da documentação:
http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
fonte
Boolean
O wrapper é útil quando você deseja se o valor foi atribuído ou não, além detrue
efalse
. Possui os seguintes três estados:null
Considerando que
boolean
possui apenas dois estados:A diferença acima o tornará útil nas Listas de
Boolean
valores, que podem terTrue
,False
ouNull
.fonte
Suponho que, em alguns casos, você deva ter um mecanismo para distinguir um campo booleano que já defina valor ou não.
fonte
O objetivo principal do booleano é o valor nulo. O valor nulo diz que essa propriedade é indefinida , por exemplo, na coluna anulável do banco de dados.
Se você realmente precisar converter tudo de booleano primitivo em booleano de wrapper, poderá usar o seguinte para dar suporte ao código antigo:
fonte
Existem muitos usos para o valor ** null ** no wrapper booleano! :)
Por exemplo, você pode ter em um formulário um campo chamado "boletim informativo" que indica se o usuário deseja ou não um boletim informativo em seu site. Se o usuário não selecionar um valor nesse campo, convém implementar um comportamento padrão para essa situação (enviar? Não enviar ?, questionar novamente ?, etc). Claramente, não definido (ou não selecionado ou ** nulo **), não é o mesmo que verdadeiro ou falso.
Mas, se "não definido" não se aplicar ao seu modelo, não altere a primitiva booleana;)
fonte
Em uma definição estrita de um elemento booleano, existem apenas dois valores. Em um mundo perfeito, isso seria verdade. No mundo real, o elemento pode estar ausente ou desconhecido. Normalmente, isso envolve a entrada do usuário. Em um sistema baseado em tela, ele pode ser forçado por uma edição. Em um mundo em lotes usando um banco de dados ou entrada XML, o elemento pode estar facilmente ausente.
Portanto, no mundo não perfeito em que vivemos, o objeto booleano é ótimo, pois pode representar o estado ausente ou desconhecido como nulo. Afinal, os computadores apenas modelam o mundo real e devem dar conta de todos os estados possíveis e lidar com eles com exceções lançadas (principalmente porque existem casos de uso em que lançar a exceção seria a resposta correta).
No meu caso, o objeto booleano era a resposta perfeita, já que o XML de entrada às vezes tinha o elemento ausente e eu ainda podia obter um valor, atribuí-lo a um booleano e depois procurar um nulo antes de tentar usar um teste verdadeiro ou falso. .
Apenas meus 2 centavos.
fonte
Para todas as boas respostas acima, vou apenas dar um exemplo concreto no servlet Java
HttpSession
classe de . Espero que este exemplo ajude a esclarecer alguma dúvida que você ainda possa ter.Se você precisar armazenar e recuperar valores para uma sessão, use o método
setAttribute
(String, Object) egetAttribute
(String, Object). Portanto, para um valor booleano, você é forçado a usar a classe booleana se desejar armazená-la em uma sessão http.A última linha causará a
NullPointerException
se os valores do atributo não estiverem definidos. (essa foi a razão que me levou a este post). Portanto, o estado lógico 3 chegou para ficar, se você prefere usá-lo ou não.fonte
A melhor maneira seria evitar completamente os booleanos, pois todo booleano implica que você tem uma declaração condicional em qualquer outro lugar do seu código (consulte http://www.antiifcampaign.com/ e esta pergunta: Você pode escrever qualquer algoritmo sem uma declaração if ? ).
No entanto, pragmaticamente você precisa usar booleanos de tempos em tempos, mas, como você já descobriu por si mesmo, lidar com booleanos é mais suscetível a erros e mais complicado. Então, eu sugiro usar booleanos sempre que possível. Exceções disso podem ser um banco de dados legado com colunas booleanas anuláveis, embora eu tentasse ocultar isso também no meu mapeamento.
fonte
Booleano pode ser muito útil quando você precisa de três estados. Como no teste de software, se o teste for aprovado, envie true, se falhar, envie false e se o caso de teste for interrompido, envie null, o que indicará que o caso de teste não foi executado.
fonte