Avatar billede Peter Praktikant
12. maj 2002 - 15:08 Der er 9 kommentarer og
2 løsninger

return kopi af objekt.

Jeg har en metode som henter et objekt i en LinkedList ( et Point) og returnerer det. Dette betyder, at hvis jeg ændrer på det Point der bliver returneret bliver det ændret i LinkedList og jeg får et andet Point næste gang det bliver returneret.
Jeg vil derfor gerne vide hvordan jeg i stedet returnere en kopi af Point så jeg kan ændre det uden fare for at det bliver ændret i LinkedList.

Metoden:
public Point nextPoint(){
  return (Point) points.next();
}
hvor points.next() henter næste punkt i LinkedList.
Avatar billede aslan Nybegynder
12. maj 2002 - 15:18 #1
int point;

int nyPoint = point;

så kan du lave om på nyPoint som er en kopi af point lige så tosset du vil?
Avatar billede Peter Praktikant
12. maj 2002 - 15:28 #2
men det er jo ikke en primitiv variabel, det er jo et objekt, så hvis jeg skriver
Point p;
Point q = p;

peger q jo bare på p, så ændringer foretaget i q sker i p.
Avatar billede codemon Nybegynder
12. maj 2002 - 15:32 #3
Point implementerer Cloneable så det er bare at
return (Point)points.next()).clone();
Avatar billede jakoba Nybegynder
12. maj 2002 - 15:32 #4
med klasser er det lidt mere kompliceret :-)

sørg for at din klasse Point implementerer cloneable og giv den en funktion clone

fx:
class Point implements Cloneable {
 
  final public Object clone( ) {
      try {
        return super.clone();
      } catch ( CloneNotSupportedException e ) {
        throw new Error( "Umulig fejl i clone.\n" +e.toString() );
      }
  } // end clone
 
// Altmulig andet du har i den klasse ...

} // endclass Point

hvis alle variable i klassen point er atomære (dvs ikke objekter) er det alt hvad du behøver at gøre. Hvis der er objekter som dataindhold i klassen må du for hvert enkelt vurder om det er ok at det kun er referencen til det objekt der klones eller om der skal oprettes en clonet kopi af det objekt.

og hvis objektet igen indeholder andre objekter ...

bemærk at funktionen clone returnerer typen Objekt, så der skal evt castes:

Pount kopiAfP = (Point)p.clone();

mvh JakobA
Avatar billede Peter Praktikant
12. maj 2002 - 15:39 #5
Det ser meget smart ud. Jeg har selv lavet denne løsning som også ser ud til at virke:
public Point nextPoint(){
  Point p = (Point) points.next();
  Point q = new Point(p.getX(),p.getY(),p.getZ());
  return q;
}
Men jeg ved ikke om jeres løsning er smartere? Hvad er pænest? Er min løsning legitim?
Avatar billede jakoba Nybegynder
12. maj 2002 - 15:45 #6
Din løsning er helt legitim.

Den er knapt så hurtig i CPU-tid; men har til gengæld den store fordel at den fortæller præcis hvad du gør, og det er meget værd.

Så hvis der ikke er andre variable i et Point der skal kopierer ville jeg blive ved dem.

mvh JakobA
Avatar billede Peter Praktikant
12. maj 2002 - 16:23 #7
men metoden bliver kaldt 2-3000 gange for hvert billede der skal tegnes, og der tegnes 24 billeder i sekundet, hvor meget har det så at sige?
Avatar billede jakoba Nybegynder
12. maj 2002 - 16:32 #8
Så ville jeg nok bruge clone istedetfor.

Og selv med clone er jeg lidt i tvivl om om det bliver hurtigt nok for bare et 200*300 pixels stort billede. Java er et langsomt sprog i forhold til fx C.

men prøv at måle på det. tegn 1000 billeder med den ene, og 1000 billeder med den anden; og se så hvor meget forskel det gør.

mvh JakobA
Avatar billede Peter Praktikant
12. maj 2002 - 17:19 #9
jakoba > det er en kurve jeg tegner som består af linjestykker, så det er ikke så krævende endda, men jeg har lavet det med clone() nu da det jo er hurtigere. Hvis du vil ligge et svar så du kan få nogle point.
Avatar billede jakoba Nybegynder
12. maj 2002 - 17:29 #10
anytime :)
Avatar billede Peter Praktikant
12. maj 2002 - 17:31 #11
jakoba fik flest point da hans hjælp var mest udførlig.
Tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester