TDDD78, TDDE30, 729A85 jonas.kvarnstrom@liu.se 2018 Objektorientering: Lagring och livstid Tre sorters variabler
Tre sorters variabel (1): Lokal 2 Lokal variabel Deklareras inuti en metod Vid varje anrop skapas en egen version av variabeln får ett eget x Anropet avslutas variabeln försvinner får ett eget x Anropet avslutas variabeln försvinner Skapas Försvinner
Tre sorters variabel (2): Fält Fält = medlemsvariabel = instansvariabel Deklareras inuti en klass Varje instans/objekt får sin "kopia 3 Datorns minne Nya variabler, samma namn Varje anrop till metoder i ett visst objekt använder samma variabel x Variabeln försvinner bara när objektet slängs bort Skapas vid new Player() Används utan att deklareras igen, ändrar på värdet i objektet Används, det värde som nu lagras i objektet
Varning för fält (1) 4 Varning: Använd inte fält när lokala variabler räcker! Exempel: Listan finns kvar ända till nästa anrop, trots att ingen annan behöver den Problematisk modellering Kan använda minne i onödan
Varning för fält (2, överkurs) 5 Exempel: Med multitrådade program kan man få flera samtidiga anrop Halvvägs klart, men någon annan anropar samma metod i samma objekt, byter ut list även för första anropet! Andra (höger) returnerar 3 element, första (vänster) returnerar 4 element
Tre sorters variabel (3): Statisk 6 Statiskt fält = klassvariabel Deklareras i en klass, static Vid programkörning skapas en variabel i klassen, som finns kvar under hela körningen Statiskt = allokeras inte dynamiskt, en gång per objekt som skapas med new getcircum getarea setradius code code code Håll reda på antal cirklar som skapades: Måste ligga i klassen, inte varje cirkelobjekt Behöver inget objekt för att komma åt värdet: klassnamn.fältnamn
Statiska fält 1: När objekt skapas 7 När objekt skapas: getcircum getarea setradius code code code Att komma åt fältet:
Statiska fält 2: Som namngivna konstanter 8 Konstanter bör (nästan) alltid namnges för läsbarhet Namngivna konstanter: static i klassen final ändras inte namn stora bokstäver (WITH_UNDERSCORE) Lagras en gång slösar inte minne Vanlig anledning till komplettering!
Statiska fält 3: "Globala" variabler 9 Kan också användas till "globala" variabler, publikt åtkomliga överallt Varning! Globala variabler ger ofta problem! Använd dem bara i undantagsfall!
Exempel: Poänglista i Tetris (1) 10 Tetris: Alla som spelar ska ha samma highscore-lista Ska aldrig ändras: Vi kommer aldrig att vilja dela upp spelare i grupper med olika listor Global variabel kan möjligen vara OK
Exempel: Poänglista i Tetris (2) 11 Alternativ 1: Lagra all information direkt som statiska variabler Listan är statisk och publik vem som helst Användning: An HighscoreList.addScore(theScore); Det finns inget objekt av HighscoreList-typ kan inte skicka som parameter, kan inte skapa flera listor, kan inte använda ärvning [senare], KOMPLETTERING!
Exempel: Poänglista i Tetris (3) 12 Alternativ 2, Singleton: Låt listan vara ett objekt Men se till att bara en instans skapas, och ge enkel tillgång till den Problem: Vem som helst kan komma åt listan utan att ha "fått" den Kan bli svårare att förstå programmets struktur Oftast bra att undvika (skicka istället objektet Användning: till de som behöver det) HighscoreList hs = HighscoreList.getInstance(); hs.addscore(thescore); // Vanligt objekt!
Exempel 2: Spelbräde i Tetris 13 Tetris: Just nu spelas bara ett spel i taget Frestande att låta spelbrädet vara en singleton Alla kan direkt komma åt den, behöver inte skickas som metodparameter Senare: Vill kunna spela flera spel parallellt, över nätet Varje spel ska ha sitt eget -objekt Måste göra om koden Globalt tillstånd gör förändringar svårare! Kan ge komplettering! Använd bara globala tillstånd om ni är helt säkra på att man inte har någon anledning att ändra det
Rätt indelning? 15 Mönster: Skapa gränssnitt som håller reda på alla konstanter (Gränssnitt används för typhierarkier och kan innehålla konstanta fält) Ses ofta som antimönster Ofta dålig indelning: Här är allt som är konstant i hela projektet Konstanterna hör ofta till någon annan placera dem där! GameGUI hanterar gränssnittet [och vet/äger allt om det, inklusive positioner] Bättre: Här är allt som har med grafiska gränssnittet att göra
Två sorters metoder 17 Instansmetoder Anropas för ett specifikt objekt: Statiska metoder (klassmetoder) Anropas för en klass: Kan använda "samma objekt": Anropa andra metoder Använda fält Det närmaste man kan komma till en "global funktion"
Statiska metoder: Exempel 1 18 När du startar ett Java-program... Du bestämmer vilken klass som ska "startas" ( ) Java skapar inte ett objekt av den typen Laddar in själva klassen Letar efter en speciell statisk metod: Om den existerar: Anropar den
Statiska metoder: Exempel 2 19 Att anropa metoder i samma klass: är inte static Samma som Men this = "objektet som den här metoden, main(), anropades i" Finns inte kompileringsfel! Samma som Fungerar bra!
Statiska metoder: Exempel 3 20 Men statiska metoder kan så klart anropa icke-statiska! Bara vi anger i vilket objekt println() och length() är inte statiska Fungerar bra: Vi försöker inte använda this
Statiska hjälpmetoder 21 En metod som roten ur : Hör inte naturligt till ett specifikt objekt Behöver inte lagra information som finns kvar när den returnerat Kan vara en statisk hjälpmetod Exempel: java.lang.math
Hjälpklasser 22 Bara statiska metoder en hjälpklass (utility class) Används i undantagsfall Flera associerade funktioner som inte hör ihop med andra klasser Komplex kod eller används av flera klasser (annars kan det placeras i användande klassen!) Vill inte kunna skapa objekt av denna klass Skapa en privat konstruktor!