23. november 2004 - 20:56Der er
25 kommentarer og 1 løsning
Flere referencer til variabler af simpel type
Når man arbejder med objekter, kan man jo have flere referencer til samme objekt, f.eks.: Point p,q; p=new Point(); q=p; p.x=5; System.out.println(p.x+" "+q.x);
q og p peger på samme objekt, hvorfor q.x har samme værdi som p.x.
Er det samme muligt for variabler af simple typer?
Baggrund: I visse sammenhænge kan man have glæde af at "mappe" en rækker variabler til f.eks. en array-struktur a la: int[] a={i,j,k}; a[0]=5;
Dette vil imidlertid ikke ændre indholdet af 'i', da 'a' peger på et andet sted i memory.
Men kan man alligevel oprette en array-struktur, der peger på en række eksisterende variabler, således at ændringer i array-elementerne "smitter af" på de andre variabler?
->mikkelbm: Kan man ikke vha. f.eks. reflection eller lign. "få oplyst" den fysiske memory-adresse og så den vej rundt opnå effekten ved at lave flere variabler pege på samme fysiske adresse?
Hvis i er på adresse 1000, j på 1600 og k på 1640, så kan du lade a pege på adresse 1000, men så bliver a[0] 1000, a[1] bliver 1004 og a[2] bliver 1008.
I mit Point-eksempel er p.x og p.q begge simple typer, og de peger på samme adresse, da p og q peger på samme objekt. Det kan altså lade sig gøre her uden at man har brugt wrappere eller lign.
bare en lille kommentar :) interessante spørgsmål du stiller og jeg har set at du i flere af dem lægger vægt på performance. Nu ved jeg selvfølgelig ikke hvad det er du prøver og lave og hvor kritisk performance er for systemet.. men har du prøvet og gå den direkte vej uden at optimere og se hvordan det klarer sig? Nu vil du hellere bruge primitive typer frem for et wrapper objekt... men har ikke noget imod at benytte reflection (hvis det da var muligt) som jeg vil tro ville være endnu langsommere. Jeg har godt nok ikke skullet lave programmer hvor alt skal være optimeret men har læst flere bøger om emnet og den første regel har altid været at man først skal have et godt design.. derefter kan man kigge på om der er dele der kan optimeres.
I SAS, som jeg er vant til at programmere i, er arrays ikke selvstændige variabler i gængs forstand men "masker"/"mappings" over allerede eksisterende variabler. Man kan f.eks. skrive:
array a(3) (i,j,k); a(1)=5;
- herefter vil 'i' være sat til 5.
Det er den samme funktionalitet jeg er på udkig efter her. En sådan konstruktion kan i mange tilfælde give en smidig kode, idet man f.eks. nemt og kompakt kan loop'e over arrays og dermed tilgå de mange enkelte variabler på en kompakt måde.
->simonvalter: Min interesse her er behandling af data, som man læser ind fra eksterne filer. Det er sandt, at reflection er langsomt, men jeg tænker nok sådan, at det ikke gør noget, at man inden indlæsningen begynder bruger en del krudt på at "køre alle kanoner i stilling" så at sige. Når først dette er sket, bør indlæsningen kunne ske med god performance.
Jeg har i dialog med Arne testet performance omkring simple typer vs. wrapper-objekter og er lidt bange for sidstnævnte.
->arne_v og simonvalter: En noget tung work-around på nogle af mine problemstillinger er at lskrive et Java-program, der skriver et andet Java-program, som derefter udføres.
Dette er i øvrigt nogenlunde samme tankegang bag macro-sprog i SAS. Ved visse meget tunge anvendelser er macro-SAS endda utilstrækkeligt, og det kan være nødvendigt selv at skrive et SAS-program, der skriver et andet SAS-program, som derefter udføres.
Men nok lidt vidt at gå her i første omgang, når det bestemt ikke kan afvises, at jeg ikke har helt styr på mit design med mit indtil videre begrænsede Java-kendskab :-)
Giver reflection eller lign. mulighed for at få oplyst den fysiske memory-adresse for en given variabel, og kan man videre sætte en variabel til at pege på en bestemt fysisk adresse?
Nej pointer funktionaliteten er bevidst fravalgt i java. Det giver mindre risiko for fejl. Det undgår implementation specifikek problem stillinger.
Og du kan faktisk ikke mere med reflection end med bormal Java. Eneste forskel er at med reflection kan du bruge nformation som først er tilgængelige på runtime fremfor på compile time.
Arrays er altid objekter, også arrays af simple typer. I stedet for at anvende en variabel af simpel type, kan man anvende arrays af dimension 1 (!), jf.:
Jeg ved ikke, om dette principielt er anderledes end at anvende en wrapper, men jeg gætter på at performance er bedre ved denne metode end ved et wrapper-objekt.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.