2013-08-02 9 views
11

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?

+3

Oznacza to, że zmiennej "animal" nie można ponownie przypisać np. 'animal = new Animal(); // wewnątrz kodu pętli ". –

+0

@Luiggi -> Czy zmienna 'animal' nie będzie miała przypisanego nowego odwołania w każdej iteracji? –

+0

@Dowiedz sięWróć do komentarza: * wewnątrz kodu pętli *. –

Odpowiedz

21

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.

+2

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

5

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

1

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

+1

Nie uważam tego za najlepszą praktykę Java. Jeśli uważasz lub wiesz, że jest, dodaj link, który to potwierdza. –

+1

@LuiggiMendoza Gdziekolwiek mamy okazję oznaczyć coś jako 'final' po prostu pójdę na to. Popraw mnie jeśli się mylę :) –

+0

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 ** . –

2

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.

0

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.

+5

Nie rozumiem, jak "Zwierzę" może łatwo zmienić na "Ciąg". I nie, to nie odpowiada na pytanie. –

+0

@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

+0

Uważam, że odpowiedź na opublikowany Q/A jest bardziej stosowna. –

Powiązane problemy