[Java] Mina collections kopierar sista värdet till alla värden

Permalänk
Medlem

[Java] Mina collections kopierar sista värdet till alla värden

Eller ja, det är så jag upplever det. Har nu dragit fram den gamla kompilatorn ur garderoben efter ett flertal år utan något seriöst programmerande så ringrosten är ett faktum. I.v.f. så är det såhär:

Jag har en klass och i början av klassen deklarerar jag följande:

private static ArrayList<Object> objectsToBeRendered = new ArrayList<Object>();

Right, det ser väl okej ut?

Sedan har jag en liten snutt som ska adda till denna array som för närvarande ser ut såhär:

objectsToBeRendered.add(new Object(polyX, polyY, polyZ, 0.5f, 0.5f, 0.0f, color)); objectsToBeRendered.add(new Object(polyX2, polyY2, polyZ2, -0.5f, -0.5f, 0.3f, color2));

Tillslut har jag några rader kod som ser ut så här:

for (Object cObject : objectsToBeRendered) { cObject.render(); }

Det fungerar sådär lagom bra då endast objekt 2 renderas. Om jag skriver size() så ser jag att min arrayList har 2 entrys bara det att de har samma värden.

(ja jo med de här skillsen så kan tech 5 slänga sig i väggen)

Visa signatur

Into the Web Browser for iPhone, http://www.intothewebbrowser.com/

Permalänk
Medlem

En ArrayList av Object? Har du gjort din egen Object-klass eller? Alla klasser ärver ju från Object.. ser ytterst skumt ut.

Iaf, kör en assert obj1 != obj2 och se om det passerar..

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

En ArrayList av Object? Har du gjort din egen Object-klass eller? Alla klasser ärver ju från Object.. ser ytterst skumt ut.

Iaf, kör en assert(obj1 != obj2) och se om det passerar..

Ah jag har gjort en egen Object-klass. Har funderat på om jag bör döpa om den p.g.a. Object s betydelse inom java men har inte haft några problem och namnet Object passar verkligen min klass.

Ska kika på det där med assert, java är inte det språk jag kan bäst och just nu kan jag inget språk speciellt bra så det blir lite googlande först. MEN jag skulle säga att obj1 == obj2 då de verkligen delar alla värden. Utökade klassen i debugsyfte och lade till id och gav obj1 och 2 olika iden men när jag hämtade idet fick jag samma världen för de. (dvs array[0]s id = array[1]s id)

Visa signatur

Into the Web Browser for iPhone, http://www.intothewebbrowser.com/

Permalänk
Medlem

Rekommenderar att du döper om klassen även fast namnet passar. Kalla den GameObject, GFXObject eller Thing typ. Mindre förvirring så.

obj1 == obj2 kollar ifall objekten använder samma minnesadress. Två separata objekt kan teoretiskt ha samma värde på variabel id, men de kan inte finnas i samma adressutrymme.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Förstår inte riktigt hur jag ska använda assert i det här fallet, det jag hittar om assert på google är inte helt tillfredställande.

Har du kanske en kodsnutt att bjuda på?

Visa signatur

Into the Web Browser for iPhone, http://www.intothewebbrowser.com/

Permalänk
Medlem
Skrivet av oggee:

Förstår inte riktigt hur jag ska använda assert i det här fallet, det jag hittar om assert på google är inte helt tillfredställande.

Har du kanske en kodsnutt att bjuda på?

assert obj1 != obj2;
Om du får du assertion error så är det ett och samma objekt

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

assert obj1 != obj2;
Om du får du assertion error så är det ett och samma objekt

Ah men det blir väl ungefär som att skriva en if sats? I vilket fall så är obj1 != obj2 men obj1s värden är identiska med obj2s. Så fortfarande no luck.

Visa signatur

Into the Web Browser for iPhone, http://www.intothewebbrowser.com/

Permalänk
Medlem
Skrivet av oggee:

Ah men det blir väl ungefär som att skriva en if sats? I vilket fall så är obj1 != obj2 men obj1s värden är identiska med obj2s. Så fortfarande no luck.

assert används vid felsökning och kastar ett AssertionError om uttrycket är falskt. Man kan använda if-satser till samma sak men det finns fördelar med assertions vid felsökning, bland annat att man kan ignorera dem vid kompilering utan att ta bort koden, samt att strukturen på ett program blir mer överskådlig då man lätt kan känna igen asserts.

Om obj1 != obj2 så har du fel i din klass. Kanske använder du statiska klassvariabler.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

1. Döp om din Object-klass till något annat.
2. Skicka in all kod på tex pastebin.com så man får en större helhetsbild, så ska vi nog kunna lösa det.

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Medlem

Hmm tror det där statiska variabler kan vara mitt problem.

Object.polyX(som är privat och kan förändras genom Objects funktioner) bör alltså inte vara statisk och bör refereras till som this.polyX inom Object? Är jag rätt ute?

(ja ja döper väl om object då)

Visa signatur

Into the Web Browser for iPhone, http://www.intothewebbrowser.com/

Permalänk
Medlem

Varför har du gjort den static? Den ska inte vara statisk. Att sätta en klassvariabel som static innebär att den delas mellan alla instanser av klassen.

class Tomat { public static String färg; Tomat t1 = new Tomat(); Tomat t2 = new Tomat(); Tomat t3 = new Tomat(); // tre vitt skilda objekt t1.färg = "röd"; t2.färg = "grön"; t3.färg = "gul"; System.out.println(t1.färg); // gul System.out.println(t2.färg); // gul System.out.println(t3.färg); // gul

edit: uppdaterade koden så den inte var lika trasig...

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Som Teknocide nämner, du ska inte ha static i dina klasser om objekten inte ska dela på variabeln, den kan funka bra när man har en instans, men flera kan gröta till det rejält.

Permalänk
Medlem

Hade en dålig uppfattning av vad static betydde i sammanhanget och upplevde det vanligare än utan så jag körde på det för alla funktioner Nu är det dock solklart så det ska inte ställa till något fler problem. Nu funkar det att rendera flera objekt och vektorberäkningarna börjar ta plats!

Tack för hjälpen!

Visa signatur

Into the Web Browser for iPhone, http://www.intothewebbrowser.com/