2013-12-05

Final - nyckelordet i Java som många undviker

Nyligen har jag börjat inse hur kod kan optimeras genom att deklarera variabler, metoder och klasser som final och tänkte dela med mig av detta till alla dem som är tillräckligt ninja för att läsa och förstå denna blogg.

Final används oftast i kombination med static för att deklarera konstanter som återanvänds ofta i ens kod, mest frekvent String eller Integer, men givetvis finns det ett större användningsområde än så. För resten av inlägget kommer jag att kalla variabler som deklarerats som final för konstanter.

En konstant måste initieras när den deklareras eller i samtliga konstruktorer, inte ens en setter duger för initiering. Om dessa kriterier inte uppfylls kommer din IDE att ge dig ett kompileringsfel och föreslå att du ta bort final som modifier. Använd final när du vill att en variabel ej skall gå att ändra från det att objektet har instansierats. Ett exempel på detta vore den typiska variabel 'private long id', som man ej brukar ändra men ändå låter förbli en variabel istället för en konstant. En annan fördel med konstanter är att de är trådsäkra och sparar dig från besväret att behöva synkronisera variabler mellan trådar, något som få seniora utvecklare bemestrar.

Har du en klass i din kod som du vet aldrig kommer ärvas vore det smart att deklarera den som final. Konstanta klasser kan ej ärvas och final kan därför inte heller kombineras med abstract. Deklareras en klass som final kommer även alla metoder per automatik bli final.

Väljer du att låta din klass vara "ärvbar" men har metoder i din klass som du inte vill skall kunna overrideas i ärvande klasser så kan du deklarera dem som final.

Men varför skall man göra detta och vad har det för fördelar? Jo, som sagt gör det dina variabler trådsäkra men också att när JVM märker att en klass, metod eller variabel är deklarerad som final kommer den att lägga dem i cache, vilket gör åtkomsten till dem betydligt snabbare, så voíla! Nej, det gör inte någon jättestor skillnad i mindre applikationer, men i stora enterprise applikationer, som kontinuerligt processerar ofattbara mängder data så spelar dessa mikrosekunder en rätt stor roll.

Källa: Functional Programming for Java Developers, av Dean Wampler.

1 kommentar: