Rozumiem, jak działa poniższy komunikat.Jaki jest cel używania końcowego dla zmiennej pętli w ulepszonej pętli?
for(final Animal animal : animalList){
//do some function
}
Ale jaki jest cel używania słowa kluczowego końcowego tutaj?
Rozumiem, jak działa poniższy komunikat.Jaki jest cel używania końcowego dla zmiennej pętli w ulepszonej pętli?
for(final Animal animal : animalList){
//do some function
}
Ale jaki jest cel używania słowa kluczowego końcowego tutaj?
Istnieją dwa możliwe powody, aby to zrobić:
To może być po prostu sposób, aby uniknąć zmiany zmiennej pętli przypadkowo w ciele pętli. (Lub do dokument fakt, że zmienna pętli nie zostanie zmieniona.)
Można to zrobić, aby można było odwoływać się do zmiennej pętli w anonimowej klasie wewnętrznej. Na przykład:
for(final Animal animal : animalList){
executor.submit(new Runnable(){
public void run() {
animal.feed();
}
});
}
Jest to błąd kompilacji, jeśli pominąć final
w tym przykładzie.
UPDATE to nie jest błąd kompilacji w Java 8 i nowszych wersjach. Zmienna nielokalna jest teraz wymagana tylko jako skutecznie końcowa. W prostych słowach oznacza to, że zmienna nie jest przypisana do (za pomocą operatora przypisania lub operatora przyrostu lub dekrementacji po zderzeniu) po początkowej deklaracji/inicjalizacji.
Uwaga: drugi powód nie ma już zastosowania w języku Java 8. Zmienne muszą być tylko * efektywne * końcowe, aby można było odwoływać się do anonimowej klasy wewnętrznej. – shmosel
Dodanie słowa kluczowego final
nie powoduje tutaj żadnej różnicy w wydajności. Po prostu trzeba się upewnić, że nie jest ponownie przypisany w pętli.
Aby uniknąć takiej sytuacji, która może prowadzić do nieporozumień.
for(Animal animal : animalList){
//do some function
animal = anotherAnimal;
// use animal variable here
}
Można również użyć tej zmiennej w funkcji anonimowej wewnątrz pętli
To kolejny java najlepszych praktyk.
Deklaracja final
powoduje, że kompilatory Java
odrzucają wszelkie przypisania wykonane w pętli variable
.
Gdy kiedykolwiek masz szansę, Declare all enhanced for statement loop variables final
Nie uważam tego za najlepszą praktykę Java. Jeśli uważasz lub wiesz, że jest, dodaj link, który to potwierdza. –
@LuiggiMendoza Gdziekolwiek mamy okazję oznaczyć coś jako 'final' po prostu pójdę na to. Popraw mnie jeśli się mylę :) –
Więc myślisz, że deklarowanie parametrów na seterach jako' final' jest najlepsze ćwiczyć w ogóle? Twój link nie zapewnia ** prawdziwej ** różnicy między oznaczaniem zmiennej jako "ostateczną" lub nie, pamiętaj, że możesz użyć słowa kluczowego "kontynuuj" w obu przykładach, a zachowanie będzie ** takie samo ** . –
Oznacza to po prostu, że wartość animal
nie można zmieniać po ustawieniu przez pętli for. Może to być wymagane, jeśli zamierzasz odwołać się do animal
w anonimowej klasie w pewnym momencie pętli.
Nawet jeśli nie jest to jednoznacznie potrzebne, dobrze jest tworzyć zmienne, które nie zmienią ostatecznego. Może pomóc złapać błędy i sprawić, że kod będzie bardziej samokomponowany.
Kod jest cukrem Składnia tego równoważnego kodu:
for (final Iterator<Animal> iterator = animals.iterator(); iterator.hasNext();) {
final Animal animal = iterator.next();
}
myślę, że to jest odpowiedź na pytanie.
Nie rozumiem, jak "Zwierzę" może łatwo zmienić na "Ciąg". I nie, to nie odpowiada na pytanie. –
@LuiggiMendoza Przepraszamy, to była literówka. Jeśli wie, co oznaczają zmienne końcowe, łatwo je zrozumieć. Przy okazji, na przykład nie można tego zrobić w C#. – kan
Uważam, że odpowiedź na opublikowany Q/A jest bardziej stosowna. –
Oznacza to, że zmiennej "animal" nie można ponownie przypisać np. 'animal = new Animal(); // wewnątrz kodu pętli ". –
@Luiggi -> Czy zmienna 'animal' nie będzie miała przypisanego nowego odwołania w każdej iteracji? –
@Dowiedz sięWróć do komentarza: * wewnątrz kodu pętli *. –