14 maja 2008

SCJP - Zasięg widoczności zmiennych

Dzisiaj będzie o zasięgu widoczności zmiennych (ang. variable scope) – kontynuacja serii zapowiedzianej w artykule "Przygotowania do SCJP czas zacząć". Temat prosty, więc nie będę się rozpisywał. Właściwie to ograniczę się do dwu przykładów, które demonstrują pewne możliwości popełnienia błędu, a raczej możliwości bycia wprowadzonym w błąd na egzaminie SCJP.

Pierwszy przykład pokazuje błąd często popełniany przez początkujących programistów, tj. próbę odwołania się do zmiennej instancji (bez użycia instancji) z metody statycznej.

public class Test {
String str = "Some text";

public static void main(String[] args) {
System.out.println(str); // błąd!
}
}

Jest dosyć oczywiste, że to nie może działać, więc zdaje się, że nie powinniśmy popełnić takiego błędu, ale weźmy pod uwagę sytuacje, w których najczęściej taki kod powstaje. Są to pisane na szybko programiki mające za zadanie przetestowanie czegoś prostego – w takiej sytuacji wiele się nie myśli, po prostu się pisze.

Zerknijmy na kolejny przykład. Przedstawia on funkcję, która wylicza zadaną potęgę dla zadanej podstawy. Patrząc na taki kod przypuszczalnie skupimy uwagę na algorytmie – analizując jego poprawność – i nie weźmiemy pod uwagę, że program się nawet nie skompiluje. Nie ma problemu, jeśli programujemy z użyciem IDE, ale na egzaminie SCJP nie ma tak dobrze.

static long power(long base, long exponent) {
for(int x = 1, y = 0; y < exponent; y++) {
x *= base;
}

return x; // błąd!
}

Zmienna x została zadeklarowana w pętli i do tejże pętli ograniczony jest zakres jej widoczności – jak napisano w Książce, podczas egzaminu na SCJP będziemy wielokrotnie testowani z umiejętności wykrywania tego typu błędów.

2 komentarze:

koziołek pisze...

Mariuszu dodał bym jeszcze kawałek o klasach anonimowych i widoczności zmiennych z klas, które są ich właścicielami (i dlaczego ma być final). Było na ostatnim JUGu poruszone.

Mariusz Lipiński pisze...

Rzeczywiście,

sam fakt, że pytanie takie pojawiło się na ostatnim JUG'u świadczy o tym, że trzeba by coś na ten temat napisać. Problem jest jednak taki, że wiedza w referowanej przeze mnie Książce jest niestety prezentowana w sposób nie kompleksowy, a ja nie zawsze mam samozaparcie, żeby wybiegać mocno w "przyszłość". Zapewne ta wiedza w Książce jest, tyle, że przy okazji omawiania klas wewnętrznych/anonimowych i pewnie poczekam z uzupełnieniem do tego momentu.

Pozdrawiam i dzięki za uzupełnienia.