W podręczniku, w którym szukałem klasy, stwierdzono, że instrukcja może być pusta (instrukcja zerowa). Instrukcja null jest zdefiniowana jako tylko średnik.
Nie robi absolutnie nic w czasie wykonywania. Instrukcja zerowa jest rzadko używana.
Jako średnio doświadczony programista uważam za interesujące, że, jak mówią, rzadko używane, oznacza to, że gdzieś jest do tego użyteczne.
Jakie może być zastosowanie takiego oświadczenia?
Można go użyć, gdy instrukcja jest wymagana składniowo, ale nie semantycznie. Najczęstszym przypadkiem jest pominięcie jednej z części pętli for, jak w tym przykładzie , chociaż większość osób uważa to użycie za dziwne i trudne do odczytania. Jak mówi twoja książka, jest rzadko używana.
źródło
while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }
oczywiście w osobnych wierszach. Mógłbym to napisać jakowhile ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }
, ale to byłoby złe.void method(){ //code here. If(condition){return ;}}
.Wolę używać pętli while , ale wyrażenie puste pozwala napisać to:
Jednak instrukcja zerowa pozwala napisać to:
Jego głównym celem jest marnowanie czasu słabego programisty konserwacji, który idzie za tobą i zastanawia się, dlaczego wątek nie działa. Oświadczenie musi nastąpić chwilę. Sam ; jest stwierdzeniem. Tak więc ten blok instrukcji nie jest właściwie częścią pętli.
To nie znaczy, że nie ma dobrych zastosowań. Są po prostu rzadkie. Zwykle wyglądają tak:
Ponieważ w ten sposób wygląda to tak, jakbyś chciał to zrobić (nawet to czasem nie wystarcza).
W zestawie ta instrukcja zerowa nosi nazwę a NOP . W Pythonie nazywa się to pass . W java (i innych dzieciach z c) jest to średnik, jak powiedziałeś, a nawet potwierdzasz prawdę;
Znam kilka zastosowań:
Semantyczny .
Istnieje różnica między pustą przestrzenią a położeniem zera jako odpowiedzi. To wyraźnie mówi: nie, nie zapomniałem tu coś umieścić. To nic nie ma być niczym. To wyraźnie nic. To miejsce celowo pozostawiono puste. W ten sposób kompilujemy N / A.
Wzór zerowy
Wyobraź sobie skomplikowaną i kosztowną maszynę sygnalizacji świetlnej, która wielokrotnie podniosła kolorową żarówkę z przenośnika taśmowego, wkręciła ją w gniazdo, włączyła, wyjęła i podniosła następną. Możesz kontrolować, co ta rzecz sygnalizuje kolorem żarówek umieszczonych na pasku. Świetnie, teraz, gdy wreszcie działa bez zarzutu, twój szef chce, abyś stworzył sposób kontrolowania synchronizacji tych sygnałów. Chce dodać przerwę między wiadomościami. Z przerażeniem pamiętasz, że wiele części dba o synchronizację tych sygnałów i jak trudno było je zsynchronizować. Jak zamierzasz kontrolować czas bez utrzymywania cię w pracy przez weekend? Patrzysz na kosz z wypalonymi żarówkami i dostajesz, no dosłownie, świetny pomysł.
Czasami chcesz użyć polimorfizmu, aby po prostu coś wyłączyć, nie niszcząc niczego.
Debugowanie
Po ustawieniu punktu przerwania musi istnieć miejsce, w którym powinien znajdować się punkt przerwania. Teraz na pewno niektóre debuggery pozwolą ci ustawić go na zamykającym nawiasie klamrowym, ale jeśli nie, to fajnie, że język pozwala ci zmusić miejsce do umieszczenia, nawet jeśli to miejsce nic nie robi.
Naprawdę nie jest to sprawa Java, ale są też:
Binarne majstrowanie
Instrukcja NOP asemblowania pozwala na manipulowanie skompilowanym binarnym plikiem wykonywalnym. Ale współczesne kompilatory Java tak bardzo się optymalizują. Nie jestem pewien, czy średnik po prostu się nie psuje. Ale w dawnych czasach używaliśmy również tych pustych miejsc w pliku wykonywalnym do kontrolowania synchronizacji lub pozwalania nam później wpadać w haczyk. Bez NOP byłyby tam aktualne instrukcje, więc jeśli chcesz zaczepić, musisz skopiować te instrukcje gdzie indziej, aby zrobić miejsce na zaczep. Działa to równie dobrze w języku c, z którego Java czerpie dużą część swojej składni. Ale nie sądzę, że ten haczyk na skrzypcach zdarza się często w Javie. W tym celu używamy programowania zorientowanego na aspekty .
źródło
for
nie zawiera zerowych instrukcji. Instrukcje zerowe (inaczej puste instrukcje) mogą występować w tym samym miejscu, w którym mogą wystąpić inne instrukcje (np. Anif
), ale poniższe nawiasyfor
nie pozwalają na instrukcje między średnikami, a jedynie na inicjalizatorze i dwóch wyrażeniach, które są opcjonalne. Jest to więc inne zastosowanie średnika niż jako terminatora.for(;;);
Używam go, ponieważ Java jest zaprojektowana w sposób niezgodny z ludzkim językiem. To samo dotyczy C.
Oświadczenie jest
statement;
.Instrukcja if-then-else to
if (condition) statement; else statement;
Instrukcja if-then-else z blokami złożonymi to
if (condition) {statements} else {statements}
To wyraźnie nonsens.
Odpowiednio piszę
if (condition) {statements} else {statements};
logicznie i rozsądnie.Jeśli projektanci Javy chcą potraktować to jak gdyby wtedy, a po nim napis zerowy, nic mi nie jest. Jeśli to czyni ich szczęśliwymi, niech to czyni ich szczęśliwymi.
źródło
if (condition) {statements;} else {statements;}
. Ponadto Java jest dość konsekwentna, jeśli chodzi o niepotrzebne;
później}
. To tak, jakby ludzkie języki często nie przyklejały kropki na końcu zdania, które już kończy się znakiem zapytania. (Oczywiście, istnieją!?
lub?!
zakończeń, ale to są tylko przybliżeniem‽
, w interrobang charakterem .)