You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 10 Next »

I java finnes det et sett med primitive datatyper, slik som boolean, char, int, osv. Disse datatypene er forhåndsdefinerte av språket, og har navn etter sitt eget reserverte keyword. De primitive datatypene deler ikke tilstand med noen av de andre. Mer om de primitive datatypene i java her, og for mer om bruken av datatyper generelt her

Selv om noen datatyper regnes som primitive i java, kan disse datatypene fortsatt representeres ved en verdiklasse. Det vil si at f.eks. char-datatypen kan "pakkes inn" i en Character-klasse:

 

Character
char c_prim = 'c';
Character c_class = new Character('c');
 
System.out.println(c_prim == c_class); // true

Her kan man se at java ikke skiller mellom variabler som er initialisert
gjennom den primitive datatypen, eller dens tilhørende klasse.

 

Integer
Integer first = new Integer(5);
Integer second = new Integer(5);
 
System.out.println(first.equals(second)); // true

I tillegg ser man her at der java vanligvis skiller mellom objekter som inneholder samme
informasjon, er ikke dette tilfellet for klassene som pakker inn en primitiv datatype.

Som eksemplifisert ovenfor er altså ikke disse klassene hovedsaklig ment for bruk i objektorientert sammenheng. Klassene inneholder derimot en rekke statiske metoder, som kan brukes for å hente informasjon om eller manipulere verdier av de primære datatypene. 

Typiske eksempler:

CharacterIntegerDouble
Character.toLowerCase(char)Integer.parseInt(String)Double.isInfinite(double)
Character.isWhitespace(char)Integer.doubleValue(int)Double.parseDouble(string)
Character.isDigit(char)Integer.toString(int)Double.compareTo(double)

Det er verdt å merke seg at Number-klassene (Integer,Double,Float,osv) har metoder knyttet til konvertering mellom hverandre som brukes på objekter.

Verdiklasser knyttet til generics

I tilknytning til Collection-rammeverket og generictar vi også i bruk verdiklassene. Når vi deklarerer en ny collection er det ofte ønskelig å definere hva slags informasjon som skal legges i denne, og vi vil da måtte oppgi hvilken verdiklasse informasjonen tilhører. Dette gjøres ved å legge til verdiklassen(e) som parameter(e) når en klasse eller et grensesnitt initialiseres. Dette gjøres ved å bruke "vinklede brackets" (<>), se eksempel under:

 

Without generics
List list = new ArrayList();
list.add(1337);
int i = (Integer) list.get(0);

 

 

With generics
List<Integer> list = new ArrayList<Integer>();
list.add(1337);
int i = list.get(0); // no cast

Vi bruker her Integer siden denne klassen "representerer" et int

 

With generics
List<Person> list = new ArrayList<Person>();
list.add(new Person("Per"));  // Assumes Person-class exists
Person p = list.get(0); // no cast 

 

Hovedargumentet for å bruke generics er at vi får kode som er mer typesikkert ved kompilering (mye lettere å finne bugs ved kompilering enn runtime). I tillegg unngår vi casting og det muliggjør implementering av algoritmer som fungerer på ulike datatyper. Mer om generics her.

Null-verdi

En spesiell verdi i java er null. Denne verdien kan ordnes til alle datatyper og representerer "ingen ting". 
Dersom man setter en verdi til null vil det typisk være fordi man ønsker å uttrykke en av følgende

  • Uinitialisert tilstand
  • Betingelse for terminering
  • Ikke-eksisternede objekt
  • En ukjent verdi

En kan også returnere null fra et funksjonskall dersom man vil uttrykke at det ikke er funnet noe, at ingen passer eller at resultatet er ukjent.

Noen har sterke meninger knyttet til hvorvidt bruken av null løser mer problemer enn den skaper. I dette kurset er det viktigste å være obs på NullPointerException som kastes dersom man prøver å kalle metoder eller hente felt fra null. Dersom man f.eks. forventer en String returnert, men får null, vil dette skape problemer med mindre man tester om objektet er lik/ulik null: obj == null  /  obj != null). 


 

  • No labels