[JAVA] Verwijzing van Object

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DonnyR
  • Registratie: November 2009
  • Laatst online: 28-04 09:56
Hey,

Ik probeer een undo functie te maken voor een spel wat ik maak.

Voorbeeld:
Java:
1
2
Veld v = new Veld();
ArrayList<Veld> lijstje = new ArrayList<Veld>();


Ik wil in een ArrayList bijhouden welke kleuren het object v allemaal heeft gehad.
En dan met een undo method de kleur terug veranderen naar de laatste opgeslagen kleur in de ArrayList
Java:
1
2
3
4
5
6
7
8
v.setKleur(groen);
lijstje.add(v)

v.setKleur(paars);
lijstje.add(v)

v.setKleur(blauw);
lijstje.add(v);


Nu heb ik 3 verwijzingen naar v in een ArrayList gestopt, alleen als ik nu het aan de v op index 0 vraag wat zijn kleur is zegt die blauw .Maar ik wil groen terug krijgen.

Ik wil dus dat v onthoud wat zijn kleur op elke positie in de ArrayList was.

Ik heb al geprobeerd om een nieuw object Veld aan te maken, die final maken en dan verwijzen naar v. Maar dan gebeurde precies hetzelfde.

Weet iemand soms hoe ik dit wel zou kunnen oplossen?
Of is wat ik probeer niet mogelijk?

Bij voorbaat dank als je de moeite heb genomen om dit alles door te nemen :)

Acties:
  • 0 Henk 'm!

  • aegis
  • Registratie: Augustus 2002
  • Laatst online: 17:58
zou je niet voor elke kleur een een nieuw Veld v moeten maken dan?
of je zou in een string array kunnen maken in Veld en dan met als je setKleur doet eerst de waarde van het attribut in die array zetten en dan pas naar de new kleur veranderen.

https://bettyskitchen.nl


Acties:
  • 0 Henk 'm!

  • Dricus
  • Registratie: Februari 2002
  • Laatst online: 18:30

Dricus

ils sont fous, ces tweakers

De variabele v in je code is een reference naar één instance van de class Veld. Je hebt die reference nu 3x in je ArrayList opgenomen en 3x de kleur van die ene instance veranderd. Alle 3 de elementen in je list verwijzen dus naar hetzelfde object en zullen desgevraagd dus dezelfde kleur teruggeven.

Uit je code en je verhaal maak ik op dat het misschien verstandig voor je is om een wat begrip te krijgen van classes, objecten en references in het algemeen en in Java in het bijzonder.

Om dit op een nette OO manier op te lossen zou eens naar het Memento pattern kunnen kijken.

Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...


Acties:
  • 0 Henk 'm!

  • michiel_
  • Registratie: Juli 2005
  • Niet online
Nu heb ik 3 verwijzingen naar v in een ArrayList gestopt
Daar zeg je precies waar het mis gaat. Je hebt in je lijst 3 verwijzingen naar 1 en hetzelfde object. Op het momentje dat je via die verwijzing de kleur veranderd, veranderd het voor dat ene object. Haal je hem dan weer op via een andere verwijzing, krijg je hetzelfde object terug.

De oplossing is dus om elke keer een nieuw veld te constructen.

Acties:
  • 0 Henk 'm!

  • Ghehe
  • Registratie: April 2011
  • Laatst online: 09-10 18:13

Ghehe

400 pound hacker

Je steekt je object veld in je ArrayList, je ArrayList bevat een verwijzing naar je object (dus v). Als je dus operaties uitvoert op je v dan blijft de referentie in je ArrayList hetzelfde. Als je het dan ophaalt krijg je je object terug en krijg je evident "blauw" terug als kleur.

Je zou in je lijstje Strings kunnen bijhouden. :) Of een Enum. ;) (Enum lijkt me zelf het handigste tenzij je echt heel veel kleuren toelaat in je programma :p )

Acties:
  • 0 Henk 'm!

  • Dars123
  • Registratie: Juni 2008
  • Laatst online: 23-11-2022
Als je wilt undoën (?) is een Stack voor de hand liggender...en even lezen hoe JAVA de references van objecten bijhoudt.

Acties:
  • 0 Henk 'm!

  • Avalaxy
  • Registratie: Juni 2006
  • Laatst online: 23:47
Ik zou inderdaad een stack verkiezen boven een arraylist, je hebt namelijk gewoon een first in last out opstapeling van acties, die je in dezelfde volgorde terug wilt draaien.

Acties:
  • 0 Henk 'm!

  • DonnyR
  • Registratie: November 2009
  • Laatst online: 28-04 09:56
Dars123 schreef op woensdag 21 december 2011 @ 16:06:
Als je wilt undoën (?) is een Stack voor de hand liggender...en even lezen hoe JAVA de references van objecten bijhoudt.
Ik gebruik een ArrayDeque en met push add ik een Veld[][]
en met pop haal ik een Veld[][] eraf.

Edit:
Wat er mis ging snapte ik wel.
Alleen een oplossing ervoor zoeken lukt met niet.
Kan ik die 3 verwijzingen in de ArrayList niet op een manier final maken. Zodat ze niet mee veranderen als er nog acties op v worden gedaan?

[ Voor 25% gewijzigd door DonnyR op 21-12-2011 16:26 ]


Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 23:46

Ventieldopje

I'm not your pal, mate!

Zoals al eerder gezegt hier, je stopt een reference in een array, geen wonder dus dat als je v (reference) verandert, alle andere objecten ook veranderen aangezien je het object verandert waar alle v's naar verwijzen ;)

Ik ben geen java programmeur maar ik denk dat je het het beste het object dat je "final" wil hebben zoals jij het noemt gewoon moet clonen en het geclonede object in de array moet zetten ;)

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • DonnyR
  • Registratie: November 2009
  • Laatst online: 28-04 09:56
Ventieldopje schreef op woensdag 21 december 2011 @ 16:54:
Zoals al eerder gezegt hier, je stopt een reference in een array, geen wonder dus dat als je v (reference) verandert, alle andere objecten ook veranderen aangezien je het object verandert waar alle v's naar verwijzen ;)

Ik ben geen java programmeur maar ik denk dat je het het beste het object dat je "final" wil hebben zoals jij het noemt gewoon moet clonen en het geclonede object in de array moet zetten ;)
final maken en clonen werkt ook niet
Java:
1
2
final Veld clone = v.clone();
lijstje.push(clone);

Ik heb nu nog precies dezelfde situatie als voorheen.
Jammer :'(

Acties:
  • 0 Henk 'm!

  • Dricus
  • Registratie: Februari 2002
  • Laatst online: 18:30

Dricus

ils sont fous, ces tweakers

Een variabele als final aanmerken in Java betekent dat de waarde van die variabele niet meer mag veranderen. Als die variabele een reference naar een object bevat, dan mag daar dus daarna geen reference naar een ander object meer ingestopt worden.

Zo'n variabele final maken wil niet zeggen dat je geen methods meer op dat object mag aanroepen via die variabele. Het betekent ook niet dat de interne state van dat object niet meer mag veranderen. En nogmaals, die 3 v's die je in je ArrayList stopt verwijzen allemaal naar hetzelfde object!

En nogmaals: Het is duidelijk dat je nog wat basiskennis mist over classes, objecten, references en blijkbaar ook variabelen. Mijn advies is om daar eerst eens aan te gaan werken voordat je dit soort dingen probeert. Als je dat soort basiskennis niet op orde hebt dan ga je nog heel vaak tegen dit soort problemen aanlopen, zeker als je veel met collections gaat werken.

Ga dit bijvoorbeeld eens lezen.

Stel niet uit tot morgen wat je vandaag nog tot morgen kunt uitstellen...


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
DonnyR schreef op woensdag 21 december 2011 @ 17:57:
clonen werkt ook niet
Java:
1
2
final Veld clone = v.clone();
lijstje.push(clone);

Ik heb nu nog precies dezelfde situatie als voorheen.
Wat is de implementatie van die .clone()? {return this;}? :p

Edit: ik zie dat je push() doet, wat doet denken dat je naar een stack bent geswitcht waardoor element 0 opvragen niet meer mogelijk is. In het kader van multi-undo lijkt me een stack geen handige keuze hier. :p

[ Voor 24% gewijzigd door pedorus op 21-12-2011 18:19 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • onox
  • Registratie: Februari 2006
  • Laatst online: 18-05 22:02
Als je drie velden hebt moet je ook gewoon 3 Veld objecten aanmaken :) Dat kan met new Veld(kleur). Als de kleur van het Veld nooit verandert zou je je Veld object ook immutable kunnen maken. Dan kan je bijv. een functie schrijven die (als dat nodig is) een Veld object voor jou aanmaakt en returned. Bijv. Veld.newWithColour(green) Daarnaast heeft elk Veld object dan een functie getColour. (Dit doet Java met de Integer class bijv. die een valueOf functie bevat; als ik mij goed herinner reused deze al bestaande Integer objecten) (Maar dit kan dus alleen met immutable objecten)

Nog een klein dingetje: ik zou de variable lijstje gewoon van het type List maken i.p.v. ArrayList, tenzij je echt specifieke methoden uit ArrayList nodig hebt. Meestal gaat het er namelijk om dat je hebt over een List hebt en niet zo zeer de specifieke implementatie (ArrayList of LinkedList bijv.) Als je later besluit dat specifieke operaties een betere performance geven met een andere implementatie class dan moet je overal in je code dus ArrayList gaan vervangen door iets anders :p

Java:
1
final List<Veld> lijstje = new ArrayList<Veld>();

Acties:
  • 0 Henk 'm!

  • DonnyR
  • Registratie: November 2009
  • Laatst online: 28-04 09:56
Ik heb de undo op een andere manier gemaakt.
Op deze manier wou het niet lukken.
Bedankt voor het helpen iedereen.

Topic mag wel dicht

Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 02-10 16:55
Op deze manier zou ik het ook niet aanraden te doen: immers, elke keer als je de kleur van buitenaf wou veranderen, moet je ook de geschiedenis handmatig aanpassen. De correcte (en toch goed door te denken) manier om dit op een OO-manier te doen is om de geschiedenis van een Veld zelf bij te houden; in de setters stop je een kopie van het object op je undo-stack, en zet je een undo/redo methode op je veld.

Een ietwat complexere methode die afhankelijk is van de features van je taal is om naar property-wijzigingen van je velden te luisteren vanuit een 3e object, die zelf de state bijhoudt. Maar da's een verhaal voor de volgende keer.

Acties:
  • 0 Henk 'm!

  • bwerg
  • Registratie: Januari 2009
  • Niet online

bwerg

Internettrol

@TS:
Maar snap je nou wat er mis ging? Want als je dat niet weet, dan kun je praktisch geen java programmeren. ;) Dit ga je waarschijnlijk héél veel tegenkomen.

Heeft geen speciale krachten en is daar erg boos over.


Acties:
  • 0 Henk 'm!

  • DonnyR
  • Registratie: November 2009
  • Laatst online: 28-04 09:56
bwerg schreef op woensdag 21 december 2011 @ 22:00:
@TS:
Maar snap je nou wat er mis ging? Want als je dat niet weet, dan kun je praktisch geen java programmeren. ;) Dit ga je waarschijnlijk héél veel tegenkomen.
Jawel, in me start post had ik al gezet dat ik wist dat alles naar 1 object verwees.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
DonnyR schreef op woensdag 21 december 2011 @ 23:07:
Jawel, in me start post had ik al gezet dat ik wist dat alles naar 1 object verwees.
Als je dat weet is de conclusie toch ook makkelijk? 3 objecten opslaan. Ben wel benieuwd naar je oplossing nu.

https://niels.nu


  • pedorus
  • Registratie: Januari 2008
  • Niet online
TS heeft natuurlijk netjes het command pattern geïmplementeerd, veel flexibeler en efficiënter :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Kajel
  • Registratie: Oktober 2004
  • Laatst online: 23-09 09:07

Kajel

Development in Style

Modbreak:*snip* als je niks inhoudelijks toe hebt te voegen, reageer dan niet

[ Voor 78% gewijzigd door Woy op 23-12-2011 10:46 ]


Acties:
  • 0 Henk 'm!

  • Joshua
  • Registratie: Juli 2005
  • Laatst online: 10-10 16:11
Is er een reden dat je niet voor een Stack gekozen hebt? Ik ben wel benieuwd waarom je voor deze oplossing gekozen hebt.
Pagina: 1