Operador ternário em Java avaliando apenas uma expressão desde Java 7 - isso era diferente em Java 1.6 e inferior?

109

Preparando-me para o exame Oracle Certified Associate Java SE 8 Programmer 1, encontrei o seguinte parágrafo sobre a expressão ternária no Guia de Estudo oficial:

Avaliação da expressão ternária A
partir do Java 7, apenas uma das expressões à direita do operador ternário será avaliada em tempo de execução. De maneira semelhante aos operadores de curto-circuito, se uma das duas expressões da mão direita em um operador ternário executar um efeito colateral, então ela não pode ser aplicada em tempo de execução. Vamos ilustrar esse princípio com o seguinte exemplo: [...]

Diz que apenas uma das duas expressões é avaliada, demonstrando com o seguinte exemplo:

int y = 1;
int z = 1;
int a = y < 10 ? y++ : z++;

Aqui, apenas yincrementa, mas znão, como seria de esperar.

O que estou descobrindo é o início do parágrafo (marcado em amarelo) onde diz "As of Java 7, ...". Testei o mesmo código com Java 1.6 e não consigo encontrar diferença no comportamento. Eu esperava que o Java 1.6 avaliasse ambas as expressões apenas a partir das informações fornecidas no parágrafo. Alguém tem uma ideia do que eles queriam dizer com "As of Java 7, ..."?

Edit: Para evitar confusão: Resume-se à pergunta, uma vez que escrevem 'As of Java 7', houve algo que mudou em relação ao operador ternário, ao mudar de Java 6 para Java 7?

Mathias Bader
fonte
4
Por que você espera que z também seja aumentado? Isso não faz sentido para mim.
Jiří Kantor,
15
parece um livro mal escrito, os operadores ternários não mudaram desde o início de java, afaik
NimChimpsky,
23
Lendo a maioria das respostas postadas até agora, as pessoas parecem interpretar mal a pergunta. Não é "Por que as duas expressões não são avaliadas?", Mas sim "Por que este livro aparentemente sugere que costumava se comportar de maneira diferente?"
BambooleanLogic
23
Na verdade, eu vi que "Na data / versão X" costumava significar "Verificamos se isso é verdade na data / na versão X, mas não estamos dizendo nada sobre as versões anteriores." Acho que esse pode ser o significado aqui. (Embora você pense que seria fácil verificar as versões anteriores do Java.) De qualquer forma, isso é mais uma questão em inglês do que em programação.
David Z de
14
@DavidZ: Problemas de inglês são problemas de programação quando eles o impedem de realizar seu trabalho. Este comentário mal formulado fez o OP parar o que estava fazendo e perder tempo descobrindo que NADA MUDOU. Programação é comunicação, para o compilador / interpretador e para quem vier depois para manter o seu código. Não consigo contar as vezes que li algum código e tive que parar por causa de algo estranho que / poderia / ter tido algo a ver com o problema, apenas para descobrir que estava apenas mal "formulado".
jmoreno de

Respostas:

92

Sou um dos autores do livro de onde veio isso. Embora eu não tenha escrito essa frase específica, concordo que a intenção era "isso foi testado em Java 7". Vou fazer uma anotação para remover isso se escrevermos outra edição.

Para ser claro, o operador ternário se comportou da mesma maneira em Java 8, 7, 6, etc. E eu ficaria muito surpreso se ele mudasse no futuro.

Jeanne Boyarsky
fonte
116

Do Java 6 JLS :

Em tempo de execução, a primeira expressão de operando da expressão condicional é avaliada primeiro; se necessário, a conversão de unboxing é executada no resultado; o valor booleano resultante é então usado para escolher a segunda ou a terceira expressão do operando:

  • Se o valor do primeiro operando for verdadeiro, a segunda expressão do operando será escolhida.
  • Se o valor do primeiro operando for falso, a expressão do terceiro operando será escolhida.

A expressão do operando escolhida é então avaliada e o valor resultante é convertido para o tipo da expressão condicional conforme determinado pelas regras declaradas acima. Esta conversão pode incluir boxing (§5.1.7) ou conversão de unboxing. A expressão do operando não escolhida não é avaliada para essa avaliação particular da expressão condicional.

Redação semelhante também aparece nas edições JLS desde a versão 1.0 . O comportamento não mudou no Java 7; o guia de estudo está mal redigido.

user2357112 suporta Monica
fonte
2
Portanto, a resposta é "Não há diferença a partir do Java 7 em relação ao operador ternário", certo?
Mathias Bader,
5
Parece legítimo. Escrevi um memorando para os autores - ansioso pela resposta deles
Mathias Bader,
Você também pode provavelmente encontrar um URL que compare o código do operador entre as versões. Se você é paranóico / curioso.
Steve Clay
7
O número de perguntas mal escritas (ou simplesmente erradas) nessas certificações Oracle é sempre surpreendente novamente.
Voo