Em um livro que eu estou procurando por uma classe, afirma-se, uma declaração pode estar vazia (a declaração nula). A declaração nula é definida como apenas um ponto e vírgula.
Não faz absolutamente nada no tempo de execução. A declaração nula raramente é usada.
Como programador com experiência moderada, acho interessante que eles dizem que raramente são usados, isso implica que, em algum lugar, existe um uso para ele.
O que poderia ser o uso de tal declaração?
Você pode usá-lo quando uma instrução é sintaticamente necessária, mas não semanticamente necessária. O caso mais comum é omitir uma das partes de um loop for, como neste exemplo , embora a maioria das pessoas ache esse uso estranho e difícil de ler. Como o seu livro diz, raramente é usado.
fonte
while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }
tudo em linhas separadas, é claro. Eu poderia ter escrito comowhile ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }
, mas isso seria errado.void method(){ //code here. If(condition){return ;}}
.Eu prefiro usar um loop while , mas uma expressão nula permite que você escreva isso:
No entanto, uma declaração nula permite que você escreva isso:
O objetivo principal é desperdiçar o tempo do programador de manutenção deficiente que vem atrás de você e se pergunta por que o encadeamento não está sendo executado. Uma declaração deve demorar um pouco. Sozinho ; é uma afirmação. Portanto, esse bloco de instruções não faz parte do loop.
Isso não quer dizer que não haja bons usos. Eles são apenas raros. Eles geralmente se parecem com isso:
Porque dessa maneira parece mais que você pretende fazer isso (mesmo que isso às vezes não seja suficiente).
Na montagem, essa declaração nula é chamada de NOP . No Python, isso é chamado de passe . No java (e nos outros filhos de c), é um ponto e vírgula, como você disse, ou até afirma que é verdade;
Conheço alguns usos:
Semântica .
Há uma diferença entre um espaço vazio e colocar um zero como resposta. Diz claramente, não, não esqueci de colocar algo aqui. Este nada pretende ser nada. Não é nada explícito. Este espaço foi intencionalmente deixado em branco. É assim que obtemos N / A para compilar.
O padrão nulo
Imagine uma complicada e cara máquina de sinalização luminosa que pegou repetidamente uma lâmpada colorida de uma correia transportadora, enroscou-a em um soquete, ligou, removeu e pegou o próximo. Você pode controlar o que essa coisa sinaliza pela cor das lâmpadas que coloca no cinto. Ótimo, agora que finalmente está funcionando perfeitamente, seu chefe deseja que você crie uma maneira de controlar o tempo desses sinais. Ele quer adicionar um espaço entre as mensagens. Você se lembra com horror de que muitas partes se importam com o momento desses sinais e que dor foi sincronizá-los. Como você vai controlar o tempo sem que isso o mantenha no trabalho no fim de semana? Você olha para uma caixa de lâmpadas queimadas e obtém uma idéia brilhante - não literalmente.
Às vezes, você deseja usar o polimorfismo para desligar algo sem quebrar nada.
Depuração
Ao definir um ponto de interrupção, é necessário que haja um local para o ponto de interrupção. Agora, certifique-se de que alguns depuradores permitirão que você o ajuste na chave de fechamento, mas se não o fizerem, é bom que a linguagem permita que você force um local para colocar um, mesmo que esse local não faça nada.
Não é realmente uma coisa de java, mas há também:
Brincando binário
A instrução NOP de assemblies permite mexer com o executável binário compilado. Mas os compiladores java modernos otimizam muito isso, não tenho certeza de que o ponto-e-vírgula não seja apenas um absurdo. Mas antigamente, também usamos esses pontos vazios no executável para controlar o tempo ou permitir que fiquemos mais tarde. Sem o NOP, haveria instruções reais lá; portanto, se você quisesse conectar, teria que copiar essas instruções em outro lugar para dar espaço ao gancho. Isso funciona tão bem na linguagem c a partir da qual Java obtém grande parte de sua sintaxe. Mas não acho que essa brincadeira de gancho ocorra muito em Java. Usamos a Programação Orientada a Aspectos para fazer isso.
fonte
for
não é instruções nulas. Instruções nulas (também conhecidas como instruções vazias) podem ocorrer no mesmo local em que outras instruções (como umaif
) podem ocorrer, mas os parênteses a seguirfor
não permitem instruções entre os pontos e vírgulas, mas apenas um inicializador e duas expressões, que são opcionais. Portanto, é um uso diferente de ponto e vírgula que como terminador de declaração. Uma declaração vazia seria o último ponto e vírgula emfor(;;);
Eu o uso porque o Java é projetado de uma maneira que não é congruente com a linguagem humana. O mesmo vale para C.
A afirmação é
statement;
.Uma instrução if-then-else é
if (condition) statement; else statement;
Uma instrução if-then-else com blocos compostos é
if (condition) {statements} else {statements}
Isso é claramente um absurdo.
Por conseguinte, escrevo o
if (condition) {statements} else {statements};
que é lógico e razoável.Se os designers de Java querem tratar isso como se-então-outro, seguido por uma declaração nula, eu estou bem com isso. Se isso os faz felizes, deixe-os felizes.
fonte
if (condition) {statements;} else {statements;}
. Além disso, o Java é bastante consistente em não precisar de;
s depois}
. Por exemplo, como as línguas humanas não costumam colocar um ponto final no final de uma frase que já termina com um ponto de interrogação. (Claro, existem os!?
ou?!
finais, mas esses são apenas aproximações‽
, o caráter interrobang .)