Quando sarebbe usata una dichiarazione nulla in Java?

10

In un libro di testo che ho cercato per una classe, si afferma, un'istruzione può essere vuota (la dichiarazione nulla). L'istruzione nulla è definita come un punto e virgola.

Non fa assolutamente nulla al momento dell'esecuzione. L'istruzione null è usata raramente.

Essendo un programmatore con una certa esperienza, trovo interessante il fatto che si usino raramente , questo implica che da qualche parte, c'è un uso per questo.

Quale potrebbe essere l'uso di una simile affermazione?

    
posta Bassinator 19.08.2016 - 02:56
fonte

4 risposte

7

È in gran parte inutile, ma ci sono alcuni punti in cui è necessario. Ad esempio:

while (DoSomething());

Esegue il metodo DoSomething() finché non restituisce false. Ovviamente questo presuppone che il metodo compia anche qualche utile effetto collaterale. Ma l'istruzione vuota, cioè il punto e virgola finale, è richiesta, altrimenti il ciclo while includerebbe invece la successiva dichiarazione successiva.

(Ma per contraddire le altre risposte, for(;;) {} è non un esempio di istruzioni vuote, poiché la parentesi dopo una clausola for non contiene istruzioni, usa solo il punto e virgola per separare (opzionale Espressioni. Per i dettagli, vedi la grammatica Java . )

    
risposta data 20.08.2016 - 18:21
fonte
12

Puoi usarlo quando un'affermazione è sintatticamente richiesta ma non richiesta semanticamente. Il caso più comune è quello di omettere una delle parti di un ciclo for, come questo esempio , anche se la maggior parte delle persone lo trova strano e difficile da leggere. Come dice il tuo libro, è usato raramente.

    
risposta data 19.08.2016 - 03:52
fonte
8

Preferisco utilizzare un while loop , ma un'espressione nulla ti permette di scrivere questo:

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

Tuttavia, una dichiarazione nulla ti permette di scrivere questo:

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

Lo scopo principale è quello di sprecare il tempo del programmatore di manutenzione scadente che viene dopo di te e si chiede perché il thread non è in esecuzione. Una dichiarazione deve seguire un po '. Solo ; è una dichiarazione. Quindi questo blocco di istruzioni non è in realtà parte del ciclo.

Questo non vuol dire che non ci sono buoni usi. Sono solo rari. Di solito assomigliano a questo:

{
    ;
}

Perché in questo modo sembra più che tu voglia farlo (anche questo a volte non è sufficiente)

In assembly questa istruzione nulla è chiamata NOP . In Python si chiama un passaggio . In java (e gli altri figli di c) è un punto e virgola come hai detto, o anche asserire vero;

Conosco alcuni usi:

Semantic .

C'è una differenza tra uno spazio vuoto e uno zero come risposta. Dice chiaramente, no, non ho dimenticato di mettere qualcosa qui. Questo nulla è pensato per essere nulla. Non è esplicito. Questo spazio lasciato intenzionalmente in bianco. Questo è il modo in cui otteniamo N / A da compilare.

Lo schema null

Immagina una complicata e costosa macchina per la segnalazione luminosa che raccoglie ripetutamente una lampadina colorata da un nastro trasportatore, la infila in una presa, la accende, la rimuove e ne preleva la successiva. Puoi controllare cosa è segnalato dal colore delle lampadine che hai messo in cintura. Bene, ora che finalmente funziona perfettamente, il tuo capo vuole che tu crei un modo per controllare i tempi di questi segnali. Vuole aggiungere un divario tra i messaggi. Ricordi con orrore che molte parti si preoccupano della tempistica di questi segnali e che dolore provava a sincronizzarli. Come controllerai i tempi senza che questo ti renda al lavoro durante il weekend? Osservi un contenitore di lampadine bruciate e ottieni un'idea brillante, non letteralmente brillante.

A volte vuoi usare il polimorfismo per spegnere qualcosa senza rompere nulla.

Debug

Quando si imposta un punto di interruzione, è necessario che ci sia un posto per il punto di interruzione. Ora certi debugger ti permetteranno di settarlo sulla parentesi graffa di chiusura, ma se non lo fanno è bello che il linguaggio ti permetta di forzare un posto dove metterne uno anche se quel posto non fa nulla.

Non proprio una cosa java ma c'è anche:

Manipolazione binaria

Assemblaggi L'istruzione NOP consente di giocherellare con l'eseguibile binario compilato. Ma i compilatori Java moderni ottimizzano così tanto lontano che non sono sicuro che il punto e virgola non vada a finire male. Ma ai vecchi tempi usavamo anche questi punti vuoti nell'eseguibile per controllare i tempi o permetterci di cadere in un gancio più tardi. Senza il NOP ci sarebbero istruzioni effettive lì, quindi se si voleva agganciare si dovrebbero copiare quelle istruzioni da qualche altra parte per fare spazio al gancio. Questo funziona altrettanto bene nel linguaggio c dal quale Java ottiene gran parte della sua sintassi. Ma non penso che questo hook sia un giochetto molto in Java. Per farlo, utilizziamo Programmazione orientata agli aspetti .

    
risposta data 19.08.2016 - 04:17
fonte
-7

Lo uso perché Java è progettato in un modo non congruente con il linguaggio umano. Lo stesso vale per C.

Un'istruzione è statement; .

Un'istruzione if-then-else è if (condition) statement; else statement;

Un'istruzione if-then-else con blocchi composti è if (condition) {statements} else {statements}

Questa è chiaramente una sciocchezza.

Pertanto scrivo if (condition) {statements} else {statements}; che è logico e ragionevole.

Se i designer di Java vogliono trattare questo come se-then-else seguito da una dichiarazione nulla, io sto bene con quello. Se li rende felici, lasciali felici.

    
risposta data 19.08.2016 - 09:46
fonte

Leggi altre domande sui tag