Zasięg zmiennych lokalnych i pól w lambdach #11

Dzisiaj zajmiemy się zakresem lambd i ich dostępem do zmiennych lokalnych i pól w klasach. Na konkretnych przykładach sprawdzimy jaki zakres mają lambdy. Temat bardzo prosty, ale bardzo istotny. Szczególnie dla początkujących, którzy często irytują się, że coś nie działa 😉 Ps. Sam tak miałem 🙂

Na początek przyjrzyjmy się zmiennym lokalnym. Dostęp do zmiennych lokalnych realizowany jest w bardzo podobny sposób jak to jest w przypadku klas anonimowych. Lambdy mają dostęp do lokalnych zmiennych, które są finalne.

Mam zadeklarowany obiekt book. Tworzę metodę, której zadaniem jest sprawdzenie czy cena książki jest większa od zmiennej lokalnej maxPrice. Zmienna lokalna jest finalna i jest widziana przez naszą lambdę.

Co się stanę jeżeli usunę final z deklaracji mojej zmiennej maxPrice? Otóż nic, nasza lmabda nadal będzie widzieć zmienną maxPrice. Okazuje się, że inaczej niż w przypadku klas anonimowych, nasza lokalna zmienna nie musi mieć przedrostka final. Jest tylko jeden szczegół, nadal niejawnie musi być zmienną finalną, czyli nie możemy zmienić jej wartości. Oto przykład:

Przy próbie uruchomienia tego kodu otrzymamy taki oto błąd:

Jak widzimy, zmienna maxPrice pomimo tego, że nie została zadeklarowana jako final, nadal przez kompilator jest uznawana za zmienną finalną, bo została użyta w lambdzie. Wniosek jest z tego taki, że nasza zmienna wciąż jest niejawnie zmienną finalną. Jeżeli się pozbędziemy zmiennej w lambdzie, będziemy mogli zmieniać jej wartość, do tego czasu zawsze będzie uznawana za wartość finalną.

Zajmijmy się teraz zmiennymi globalnymi, zadeklarowanymi w zakresie całej klasy. Jeżeli naszą zmienną lokalną maxPrice zadeklarujemy jako pole klasy, sytuacja będzie zupełnie inna:

Lambda ma dostęp do pól klasy, a także do pól statycznych w klasach. Zupełnie inaczej niż w przypadku zmiennych lokalnych, zmienne globalne nie muszą być final i możemy zmieniać i wartość.

To tyle, co trzeba pamiętać o lambdach i ich zakresie. Cały kod z przykładów znajdziecie także na githubie.

 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *