Kiedy w Javie będzie używana instrukcja null?

10

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?

Bassinator
źródło

Odpowiedzi:

7

Jest to w większości bezużyteczne, ale jest kilka miejsc, w których jest to konieczne. Na przykład:

while (DoSomething());

Wykonuje tę DoSomething()metodę, dopóki nie zwróci false. Oczywiście zakłada to, że metoda ma również pewien użyteczny efekt uboczny. Ale wymagana jest pusta instrukcja, tj. Końcowy średnik, w przeciwnym razie pętla while zawierałaby zamiast tego następną instrukcję.

(Ale zaprzeczyć inne odpowiedzi, for(;;) {}to nie przykład pustych sprawozdań, ponieważ nawiasie po za klauzuli nie zawiera oświadczenia, po prostu wykorzystuje średnik do oddzielenia (opcjonalne) wyrażeń. Zobacz gramatykę Java szczegóły).

JacquesB
źródło
3
+1 - to jedyny raz, w którym widziałem, że jest naprawdę używany (jak wspomniano, puste sekcje instrukcji „for” są nieco inne). Jedyną zmianą, którą wprowadzę, jest wskazanie, że przeczytanie tego rodzaju użycia jest mylące, jeśli instrukcja null jest pozostawiona w osobnym wierszu, a nie bezpośrednio po pętli while, gdzie wygląda jak zwykła instrukcja terminator ...
Jules,
12

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.

Karl Bielefeldt
źródło
Że. Jest bezużyteczną funkcją językową. Wolałbym być zmuszony do wyraźnego odczytania powielania, niż do Google „tylko java średnika”.
Chris Cirefice,
2
@ChrisCirefice Z drugiej strony „tylko średnik: jest dość oczywiste, co należy zrobić, biorąc pod uwagę, że znasz język umiarkowanie. To nie jest osobna reguła, to tylko konsekwencja innych zasad. Plus, jeśli nauczysz się go, gdy poznasz go na zawsze, więc powiedziałbym, że to naprawdę żaden problem
Maurycy
1
Jeśli czujesz, że piszesz takie pętle, robisz coś złego.
Bassinator
Mam metodę sondowania, której używam do sprawdzania, kiedy urządzenie wraca do sieci. Kod wygląda mniej więcej tak: while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }oczywiście w osobnych wierszach. Mógłbym to napisać jako while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }, ale to byłoby złe.
BobDalgleish,
Nie jest to stwierdzenie zerowe, którego używamy również do wymuszenia wyjścia z metod „void”? void method(){ //code here. If(condition){return ;}}.
Laiv
9

Wolę używać pętli while , ale wyrażenie puste pozwala napisać to:

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

Jednak instrukcja zerowa pozwala napisać to:

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

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 .

candied_orange
źródło
2
Może się to wydawać pedantyczne, ale przykład z fornie zawiera zerowych instrukcji. Instrukcje zerowe (inaczej puste instrukcje) mogą występować w tym samym miejscu, w którym mogą wystąpić inne instrukcje (np. An if), ale poniższe nawiasy fornie 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(;;);
Pustym
Masz rację, to wydaje się pedantyczne: P. Dobrze, zwróć uwagę na moją edycję.
candied_orange
-7

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.

Martin Kochański
źródło
Jest 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 .)
8bittree
1
Słodki bóg !! o_O
Áxel Costas Pena