Jestem tym zmieszany. Większość z nas została poinformowana, że w Javie nie ma goto.
Ale odkryłem, że jest to jedno ze słów kluczowych w Javie. Gdzie można go użyć? Jeśli nie można go użyć, to dlaczego został uwzględniony w Javie jako słowo kluczowe?
Odpowiedzi:
Na listę Java słowa kluczowe określa
goto
słowo kluczowe, ale to jest oznaczone jako „nieużywane”.To było w oryginalnej JVM (patrz odpowiedź @VitaliiFedorenko ), ale potem zostało usunięte. Prawdopodobnie był przechowywany jako zastrzeżone słowo kluczowe na wypadek, gdyby miał zostać dodany do późniejszej wersji Javy.
Gdyby
goto
nie było jej na liście, a później zostanie dodane do języka, istniejący kod, który użył tego słowagoto
jako identyfikatora (nazwa zmiennej, nazwa metody itp.) Zepsułby się. Ale ponieważgoto
jest słowem kluczowym, taki kod nawet się nie skompiluje w teraźniejszości i nadal można sprawić, że zrobi coś później, bez niszczenia istniejącego kodu.źródło
This was probably done in case it were to be added to a later version of Java.
Właściwie główny powód jest nieco inny (patrz moja odpowiedź poniżej)James Gosling stworzył oryginalną maszynę JVM przy wsparciu
goto
instrukcji, ale potem usunął tę funkcję jako niepotrzebną. Główny powódgoto
jest niepotrzebny, ponieważ zwykle można go zastąpić bardziej czytelnymi instrukcjami (jakbreak/continue
) lub wyodrębnić fragment kodu do metody.Źródło: James Gosling, sesja pytań i odpowiedzi
źródło
goto
jest najbardziej gotowym i jasnym sposobem wyrażenia czegoś, więc zmuszanie go do czegokolwiek innego jest bardzo mało czytelne .Słowo kluczowe istnieje, ale nie zostało zaimplementowane.
Jedyny dobry powód, aby użyć goto, o którym mogę myśleć, to:
W Javie możesz to zrobić w następujący sposób:
źródło
break loops
środki „wyrwać się z pętli o nazwieloops
”. Może z perspektywy czasu mogłaby być lepsza nazwa etykietyouter
.while (true) {
...}
to przesada. GOTO jest często napiętnowane z powodu niewłaściwego użycia, ale twierdzę, że niepotrzebne porównania z literałami logicznymi są gorsze niż GOTO.continue LABEL;
oświadczeniem. W ten sposób możesz kontynuować zewnętrzną pętlę leżącą.http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_ke words.html
źródło
Mogą więc zostać wykorzystane pewnego dnia, jeśli projektanci języków poczują taką potrzebę.
Ponadto, jeśli programiści z języków, które mają te słowa kluczowe (np. C, C ++) używają ich przez pomyłkę, to kompilator Java może dać użyteczny komunikat o błędzie.
A może po prostu przestało programiści używać goto :)
źródło
goto
iconst
odzwierciedla swoje dziedzictwo C / C ++, ale pozostają one niezaimplementowane (chociaż dyskutowano o ich wdrożeniu). Kilka innych podobnychassert
ienum
początkowo nie było zarezerwowanych, ale być może powinno, ponieważ zostały wdrożone. Ale z perspektywy czasu to cudowna rzecz.Są zastrzeżone do użytku w przyszłości (patrz: Słowa kluczowe języka Java )
Powód, dla którego nie ma instrukcji goto w Javie, można znaleźć w „ The Java Language Environment ”:
źródło
goto
jest zastrzeżone, ale nie do wykorzystania w przyszłości.Przykładem użycia etykiet „kontynuuj” w Javie jest:
Wyniki:
źródło
Ważne jest, aby zrozumieć, że
goto
konstrukcja jest pozostałością po dniach, w których programiści programowali w kodzie maszynowym i języku asemblera. Ponieważ te języki są tak podstawowe (jak w, każda instrukcja robi tylko jedną rzecz), przepływ sterowania programem odbywa się całkowicie za pomocągoto
instrukcji (ale w języku asemblera są one nazywane skokami lub rozgałęzieniami instrukcjami ).Teraz, chociaż język C jest dość niskim poziomem, można go traktować jako bardzo asemblerowy język asemblera - każdą instrukcję i funkcję w C można łatwo podzielić na instrukcje języka asemblerowego. Chociaż C nie jest obecnie głównym językiem do programowania komputerów, nadal jest intensywnie wykorzystywany w aplikacjach niskiego poziomu, takich jak systemy wbudowane. Ponieważ funkcja C tak ściśle odzwierciedla funkcję języka asemblera, ma to sens
goto
jest uwzględniona w C.Oczywiste jest, że Java jest ewolucją C / C ++. Java ma wiele funkcji z C, ale wyodrębnia znacznie więcej szczegółów i dlatego jest po prostu napisana inaczej. Java jest językiem bardzo wysokiego poziomu, więc po prostu nie jest konieczne posiadanie funkcji niskiego poziomu, na przykład
goto
gdy więcej konstruktów wyższego poziomu, takich jak funkcje, dla każdego z nich, a podczas pętli podczas sterowania programem. Wyobraź sobie, że byłeś w jednej funkcji i zrobiłeśgoto
etykietę innej funkcji. Co by się stało, gdy druga funkcja powróci? Ten pomysł jest absurdalny.To niekoniecznie odpowiada, dlaczego Java zawiera
goto
instrukcję, ale nie pozwala jej na kompilację, ale ważne jest, aby wiedzieć, dlaczego wgoto
ogóle była używana w aplikacjach niższego poziomu i dlaczego po prostu nie ma sensu być używane w Javie.źródło
Nie,
goto
nie jest używane, ale można zdefiniować etykiety i pozostawić pętlę do etykiety. Możesz użyć etykietybreak
lubcontinue
po niej. Możesz więc wyskoczyć z więcej niż jednego poziomu pętli. Spójrz na samouczek .źródło
Nie, na szczęście nie ma
goto
Java.Słowo
goto
kluczowe jest zastrzeżone, ale nie używane (to samo dotyczyconst
).źródło
Ponieważ nie jest obsługiwany i dlaczego chcesz mieć
goto
słowo kluczowe, które nic nie robiło lub zmienną o nazwiegoto
?Chociaż możesz użyć
break label;
icontinue label;
instrukcji, aby skutecznie robić to, cogoto
robi. Ale nie poleciłbym tego.źródło
The keywords const and goto are reserved, even though they are not currently used. This may allow a Java compiler to produce better error messages if these C++ keywords incorrectly appear in programs.
Oznacza to: „Nie używamy go, więc jeśli pochodzisz z języka C ++, nie pozwolimy ci go w ogóle używać”. 2)goto
to okropna nazwa metody. Przepraszam. 3) zalecane jest przerwanie i kontynuacja, ale nie w sposób tutaj użyty . 4) „najprawdopodobniej” [potrzebne źródło].Nie,
goto
nie jest używany w Javie, mimo że jest słowem zastrzeżonym. To samo dotyczyconst
. Oba są używane w C ++, co prawdopodobnie jest powodem, dla którego są zastrzeżone; intencją było prawdopodobnie uniknięcie mylących programistów C ++ migrujących do Javy, a być może także zachowanie opcji ich używania w późniejszych wersjach Javy.źródło
goto
nie będzie obsługiwany przynajmniej w najbliższej przyszłości;)Zauważ, że możesz zastąpić większość łagodnych zastosowań goto przez
powrót
przerwa
złamać etykietę
wrzuć do środka try-catch-wreszcie
źródło
return
Jak już wspomniano,
goto
Java nie istnieje , ale słowo kluczowe zostało zarezerwowane na wypadek, gdyby Sun miał ochotę dodać cośgoto
do Javy. Chcieli mieć możliwość dodania go bez łamania zbyt dużej ilości kodu, więc zarezerwowali słowo kluczowe. Zauważ, że w Javie 5 dodalienum
słowo kluczowe i nie złamało to zbyt wiele kodu.Chociaż Java nie ma
goto
, ma pewne konstrukcje, które odpowiadają niektórym zastosowaniomgoto
, a mianowicie możliwośćbreak
icontinue
nazwane pętle. Ponadto,finally
mogą być traktowane jako rodzaj skręconagoto
.źródło
Aby zabronić deklaracji zmiennych o tej samej nazwie.
na przykład
int i = 0, goto;
źródło
Jest bardzo uważany za jedną z rzeczy, których nie robisz, ale prawdopodobnie został wymieniony jako słowo zastrzeżone, aby uniknąć nieporozumień dla programistów.
źródło
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto
Jeśli powiedziano ci, że nie ma instrukcji goto w Javie, zostałeś oszukany. Rzeczywiście, Java składa się z dwóch warstw kodu „źródłowego”.
źródło
Zobacz poniższy link pokazuje wszystkie słowa zarezerwowane dla języka Java i informuje, jakie wersje zostały dodane.
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_ke words.html
goto jest zastrzeżone, mimo że nie jest obecnie używane, nigdy nie mów nigdy :)
źródło
Nie jestem ich fanem
goto
, ponieważ zwykle sprawia, że kod jest mniej czytelny. Uważam jednak, że istnieją wyjątki od tej reguły (szczególnie jeśli chodzi o leksyki i parsery!)Oczywiście zawsze możesz przenieść swój program do Kleene Normalform, tłumacząc go na coś podobnego do asemblera, a następnie napisać coś takiego
(Więc w zasadzie piszesz maszynę wirtualną, która wykonuje kod binarny ... gdzie
line
odpowiada wskaźnikowi instrukcji)To jest o wiele bardziej czytelne niż kod, który używa
goto
, prawda?źródło
Oczywiście jest to słowo kluczowe, ale nie jest używane na poziomie kodu źródłowego.
Ale jeśli używasz języka jasmin lub innego języka niższego poziomu, który jest przekształcany do kodu bajtowego, wtedy „goto” jest dostępne
źródło
Ponieważ chociaż język Java go nie używa, robi to kod bajtowy JVM.
źródło
load
słowa kluczowego?goto nie jest w Javie
musisz użyć GOTO, ale to nie działa poprawnie. w kluczowym słowie java nie jest używane. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_ke words.html
źródło