Quando uma instrução nula seria usada em Java?

10

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?

Bassinator
fonte

Respostas:

7

É principalmente inútil, mas existem alguns lugares onde é necessário. Por exemplo:

while (DoSomething());

Isso executa o DoSomething()método até retornar falso. Obviamente, isso pressupõe que o método também realiza algum efeito colateral útil. Mas a declaração vazia, ou seja, o ponto e vírgula à direita, é necessária; caso contrário, o loop while incluiria a seguinte declaração a seguir.

(Mas, para contradizer as outras respostas, nãofor(;;) {} é um exemplo de instruções vazias, pois o parêntese após a cláusula for não contém instruções, ele usa o ponto e vírgula para separar expressões (opcionais). Consulte a gramática Java para obter detalhes.)

JacquesB
fonte
3
+1 - esta é a única vez que eu realmente o vi usar (como declarado, as seções vazias de uma instrução 'for' são ligeiramente diferentes). A única alteração que eu faria é salientar que é muito confuso ler esse tipo de uso se a instrução nula for deixada em sua própria linha, em vez de imediatamente após o loop while, onde apenas se parece com uma instrução comum terminator ...
Jules
12

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.

Karl Bielefeldt
fonte
Este. É um recurso de linguagem inútil. Prefiro ser forçado a ler explicitamente a duplicação do que ter que pesquisar no Google "apenas um ponto e vírgula java".
Chris Cirefice
2
@ChrisCirefice Por outro lado, "apenas um ponto e vírgula: é bastante óbvio o que deve ser feito, considerando que você conhece o idioma moderadamente. Não é uma regra separada, é apenas uma consequência de outras regras. Além disso, se você aprender uma vez que a conhecerá para sempre, então eu diria que não é realmente qualquer problema.
Maurycy
1
Se você achar que está escrevendo loops assim, está fazendo algo errado.
Bassinator
Eu tenho um método de pesquisa de sono que eu uso para verificar quando um dispositivo volta a funcionar. O código se parece com isso:, while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }tudo em linhas separadas, é claro. Eu poderia ter escrito como while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }, mas isso seria errado.
precisa saber é o seguinte
Não é uma declaração nula que usamos também para forçar uma saída dos métodos 'void'? void method(){ //code here. If(condition){return ;}}.
LAIV
9

Eu prefiro usar um loop while , mas uma expressão nula permite que você escreva isso:

for (;;) { thread.run(); }

No entanto, uma declaração nula permite que você escreva isso:

while(true);
{
    thread.run();
}

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.

candied_orange
fonte
2
Isso pode parecer pedante, mas o exemplo com fornã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 uma if) podem ocorrer, mas os parênteses a seguir fornã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(;;);
JacquesB
Você está certo, isso parece pedante: p. Tudo bem, observe minha edição.
Candied_orange
-7

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.

Martin Kochanski
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 .)
8bittree
1
Deus doce !! o_O
Áxel Costas Pena 23/03