Archief - [PROG]JAVA non-static method vs static context

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Devroush

Legacy Member
Die error begint serieus mijn keel uit te hangen eigelijk

Als eindproject op school (was een basiscursus java) maak ik Mastermind samen me ne vriend. Als ge nu de kleuren wilt kiezen voor een combinatie moet ge gewoon klikken op de bollen. 1 klik: rood, 2 klikken: blauw, enz.
Mouselistener enzo hebben we, maar het probleem is om de x- en y-coördinaten door te geven. We moeten immers controleren of de speler op een bol heeft geklikt, en dan nog de welke. Maar hier krijgen we die error dus constant. Ik kan wel begrijpen waarom we ze krijgen, maar hoe ik het moet oplossen is iets helemaal anders :)

Kn0t

Legacy Member
Je mag geen non-static methodes oproepen of naar non-static variabelen verwijzen vanuit een static method.

Als je dit begrijpt weet je toch ook hoe je het moet oplossen?

Je roept vanuit MousePanel de methode Spel.controleerKlik() op, terwijl deze methode niet static is, en dus op een instantie van de Spel-klasse moet aangeroepen worden.

Geef een referentie naar het Spel object ('this') door aan de MousePanel constructor, zodat je MousePanel weet tot welk spel hij behoort, en dus bijgevolg zonder problemen de methode controleerKlik() van het spel kan oproepen.

Devroush

Legacy Member
Kn0t zei:
Geef een referentie naar het Spel object ('this') door aan de MousePanel constructor, zodat je MousePanel weet tot welk spel hij behoort, en dus bijgevolg zonder problemen de methode controleerKlik() van het spel kan oproepen.

Exactly. Heb wa zitten prutsen maar da lukt mij langs geen kanten :/

jodeman

Legacy Member
public static void controleerKlik(int xx, int yy){}
dat gedaan en het werkt... Die methode was gewoon niet static

dit regeltje :
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
zou ik ook in de constructor van uw jframe zetten. Anders blijft uw programma in het geheugen staan.

Kn0t

Legacy Member
Alles static maken is 'een' oplossing, maar niet 'de' oplossing.

Als je die methode static maakt, moeten ook alle variabelen die deze methode gebruikt static gemaakt worden. Static = klasse methode/variabele. 1 per klasse dus.

Dus als je al je methodes en state static gaat maken, kan je geen 2 instanties van je spel tegelijk laten runnen, omdat hun state dan geshared wordt.

Veel static methods = code smell. Het duidt op procedureel programmeren ipv OO, slecht design, kan niet overriden worden door subclasses, ...

Waar het wel geschikt voor is: om bepaalde patterns te implementeren (vb Singleton) en voor utility methods (vb de klasse Math).

Devroush

Legacy Member
Heb kunnen ontcijferen wat jou oplossing was Kn0t, twas gewoon door het feit dat ek nog nooit van this gehoord had :)
Heb dan ook meteen uw regeltje toegevoegd jodeman.

Thx allebei

.Acku.

Legacy Member
Ja dat ook :)

Nuja, mijn eerste kleine applets deden het ook allemaal zo :(

killgore

Legacy Member
.Acku. zei:
Ja dat ook :)

Nuja, mijn eerste kleine applets deden het ook allemaal zo :(
Uhu, bij mij was het in php & c++ (de talen waarmee ik leerde proggen) eveneens eveneens zo :p (slechte architectuur & werking). Het is geen verwijt naar poster hoor, hij zei het zelf: "basiscursus java".

loopylama

Legacy Member
killgore zei:
Uhu, bij mij was het in php & c++ (de talen waarmee ik leerde proggen) eveneens eveneens zo :p (slechte architectuur & werking). Het is geen verwijt naar poster hoor, hij zei het zelf: "basiscursus java".

voor ons project mogen wij geen (zo weinig mogelijk) gebruik maken van static methoden.

.Acku.

Legacy Member
Het mag dan ook enkel gebruikt wordne in patterns die er expliciet om vragen. Dat beginners vanalles static maken komt gewoon voort uit t feit dat ze vertrekken vanuit een static main, die error krijgen omdat ze zonder new werken, en dan static als redmiddel zien om compilatiefouten weg te krijgen.

Er zijn ook mooie manieren om statics te gebruiken, onder andere in de Java API. Veelal gaat het om Factories (Document.createDocument) of utility methodes (Math.max())

Devroush

Legacy Member
Acku ik denk dat mij nie veel te verwijten valt, onze lerares had zelfs geen flauw idee wat een Mouselistener was ;)
En hoewel ik verschrikkelijk graag dit veel professioneler zou willen aanpakken (en eigelijk een grotere uitdaging dan dit maken) moet ik er rekening mee houden dat mijn metgezel der zeer weinig van snapt en dus ook geen tijd wil insteken

Concrete vb van "waarom oh in godsnaam doet ge da zo" moogt ge altijd kwijt hoor. Maar hou er rekening mee dat het basic stuff moe blijven, ons lerares moet het tenslotte verstaan :)

loopylama

Legacy Member
Devroush zei:
Acku ik denk dat mij nie veel te verwijten valt, onze lerares had zelfs geen flauw idee wat een Mouselistener was ;)
En hoewel ik verschrikkelijk graag dit veel professioneler zou willen aanpakken (en eigelijk een grotere uitdaging dan dit maken) moet ik er rekening mee houden dat mijn metgezel der zeer weinig van snapt en dus ook geen tijd wil insteken

Concrete vb van "waarom oh in godsnaam doet ge da zo" moogt ge altijd kwijt hoor. Maar hou er rekening mee dat het basic stuff moe blijven, ons lerares moet het tenslotte verstaan :)

wat voor lerares is dat nu???

wil altijd wel eens naar u programma kijken...

met wat schrijf je jou programma? textpad,... of een editor zoals together?

loopylama

Legacy Member
heb eens nr u probleem gekeken
zo zou ik het oplossen.
Code:
/*	
 * deze klasse bevat de nodige methodes die we voor iedere bol die we aanklikken
 * aanroepen. Als startcoördinaten nemen we (280,35)
 * KLEURENCODES: (6 kleuren)
 * 1 = rood
 * 2 = groen
 * 3 = blauw
 * 4 = geel
 * 5 = zwart
 * 6 = wit */ 
import javax.swing.*;
import java.awt.*;
 
public class Spel extends JFrame{
	Container pan;
	int[] oplossing = new int[6]; // rij met de combinatie die we moeten zoeken
								  // codes zitten in 1->5 , maar om één of andere reden
								  // moeten we een rij van 7 (0->6) elementen declareren
	int[] invoercombo = {1,1,1,1,1,1,1}; // Bevat de combinatie die de gebruiker ingeeft
	int poging; // de gebruiker mag 12 keer proberen.
						
	public Spel(){
		setTitle("Mastermind");
		setSize(800,600);
		setLocation(112,50);
		
		// Hier declareren we het paneel voor de MouseListener
		// Deze 3 regels zijn van [site] gehaald
		// -----------------------------
		MousePanel mp= new MousePanel(this);
     	getContentPane().add(mp);
     	mp.addMouseListener(mp);
     	// -----------------------------
 		mp.setBackground(Color.white);
 		
		setVisible (true);
		pan = getContentPane();
		pan.setLayout(null);
		//pan.setBackground(Color.white);
		maakNieuweCombinatie();
		poging = 1;
		nieuwePoging(1); 		
 		Teken.Spelbord(pan);
		//Teken.ControleBol(pan,1,3,1);
		controleerPoging();
	}
	
   	public void maakNieuweCombinatie(){
   		int nieuweKleur;
		for(int teller = 1; teller <= 5; teller++){
			nieuweKleur = (int)(1+Math.random()*6);
			for(int index = 1; index <= 5; index++){ // Controleer of de kleur nog niet		
				if(oplossing[index]==nieuweKleur){	 // voorkomt in de oplossing
					nieuweKleur = (int)(1+Math.random()*6);
					index = 0; // Nieuwe kleur, de controleloop moet opnieuw beginnen	
				}
			}
			oplossing[teller] = nieuweKleur; //Kleur is uniek, voeg toe aan combinatie
		}	
	}
	public void nieuwePoging(int rij){
 		for(int teller = 1; teller <= 5; teller++){
 			Teken.InvulBol(pan,rij,teller,0);
 			Teken.InvulBol(pan,2,teller,oplossing[teller]);
 		}		
	}
	public void controleerKlik(int xx, int yy){
	
   	}
	public void controleerPoging(){
		int hoeveelGroene = 0;
		int hoeveelRode = 0;
		
		for(int aantal = 1; aantal<=5; aantal++){
			if(invoercombo[aantal] == oplossing[aantal]){
				hoeveelGroene++;
			}
			else{
				for(int teller = 1; teller <= 5; teller++){
					if (oplossing[teller] == invoercombo[aantal]){
						hoeveelRode++;
						teller = 5;
					}
				}	
			}
		}
		Teken.ControleBol(pan,1,hoeveelGroene,hoeveelRode);
	}
	public int getPog(){
		return poging;
	}
}

en

Code:
/* 
 *Klasse voor ons project Mastermind. Het bepaalt waar de gebruiker klikte,
 *	en geeft de x en y coordinaten door. Met 'mousePressed' achterhalen we waar
 *	de gebruiker precies geklikt heeft (met xy-co.) */
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
public class MousePanel extends JPanel implements MouseListener {
	int x, y;         // hierin steken de co. van waar de gebruiker klikte
	int rij;
	private Spel parent;
	
	public MousePanel(Spel parent){
		this.parent=parent;
	}
   	// Deze methode wordt aangeroepen 
   	public void mousePressed( MouseEvent e) {
     	int mouseX = e.getX();
     	int mouseY = e.getY();
     	x = mouseX;
     	y = mouseY;
     	System.out.println( "x: "+x+" y: "+y );	
     	if((x>317 && x<337) && (y>75 && y<95)){
          	System.out.println("goeie klik");	
     	}
     	parent.controleerKlik(x,y); //-> nog op te lossen
   	}
   	// De andere methodes van MouseListener moeten we ook vermelden
   	public void mouseReleased( MouseEvent e) { }
   	public void mouseClicked( MouseEvent e) { }
   	public void mouseEntered( MouseEvent e) { }
   	public void mouseExited( MouseEvent e) { }
}

killgore

Legacy Member
Devroush zei:
Acku ik denk dat mij nie veel te verwijten valt, onze lerares had zelfs geen flauw idee wat een Mouselistener was ;)
En hoewel ik verschrikkelijk graag dit veel professioneler zou willen aanpakken (en eigelijk een grotere uitdaging dan dit maken) moet ik er rekening mee houden dat mijn metgezel der zeer weinig van snapt en dus ook geen tijd wil insteken

Concrete vb van "waarom oh in godsnaam doet ge da zo" moogt ge altijd kwijt hoor. Maar hou er rekening mee dat het basic stuff moe blijven, ons lerares moet het tenslotte verstaan :)
Zulke mensen zouden geen les mogen geven.
Ik programmeer nog maar een goed half jaar deftig java en kan er al meer van :p.

.Acku.

Legacy Member
Tja, het zal wel zo een wiskunde-lerares zijn die gevraagd werd om informatica te geven zijn zeker? Je kan hen dat dan niet te kwalijk nemen, hun passie ligt daar gewoon niet, ze leren enkel wat hoogst noodzakelijk is om het anderen aan te leren.

Het verkeerd gebruik van static komt voor uit onbegrip van het verschil tussen een klasse en een object. Ik wou het hier even uitleggen maar het blijkt fundamenteel gewoon moeilijk :) Om even te vervallen in weinig zeggende cliches: een klasse beschrijft hoe objecten zich kunnen gedragen. Een object is een op zichzelf staande entiteit los van de klasse, met een eigen status en leven. Static betekent dat het niet voor objecten geldt, maar voor de klasse zelf. Iets wat statisch is is niet het bezit van een object zelf, zoals zijn properties (variabelen) en methoden dat wel zijn.
Wat het boeltje wat verwart is het feit dat je statische methoden en vars ook kunt aanspreken via een object van die klasse, in plaats van enkel via de klassenaam. Dat is eigenlijk nooit ergens nodig.

loopylama

Legacy Member
.Acku. zei:
Tja, het zal wel zo een wiskunde-lerares zijn die gevraagd werd om informatica te geven zijn zeker? Je kan hen dat dan niet te kwalijk nemen, hun passie ligt daar gewoon niet, ze leren enkel wat hoogst noodzakelijk is om het anderen aan te leren.

Het verkeerd gebruik van static komt voor uit onbegrip van het verschil tussen een klasse en een object. Ik wou het hier even uitleggen maar het blijkt fundamenteel gewoon moeilijk :) Om even te vervallen in weinig zeggende cliches: een klasse beschrijft hoe objecten zich kunnen gedragen. Een object is een op zichzelf staande entiteit los van de klasse, met een eigen status en leven. Static betekent dat het niet voor objecten geldt, maar voor de klasse zelf. Iets wat statisch is is niet het bezit van een object zelf, zoals zijn properties (variabelen) en methoden dat wel zijn.
Wat het boeltje wat verwart is het feit dat je statische methoden en vars ook kunt aanspreken via een object van die klasse, in plaats van enkel via de klassenaam. Dat is eigenlijk nooit ergens nodig.

en eigenlijk zo gemakkelijk om toe te passen. Het is gewoon uit gemakzucht dat men zegt van "het werkt niet, we zullen maar static gebruiken" in plaats van het eens degelijk te bekijken.

dJeez

Legacy Member
Voor het genereren van een nieuwe combinatie kan je veel makkelijker tewerk gaan dan met die geneste lussen. Start met een array die de waardes 1 tem 6 bevat, verwissel in enkele iteraties telkens 2 random elementen van plaats, en gebruik dan vb. steeds de eerste 5 elementen van het resultaat als de Mastermind code.

En breek mijn bek niet open over wiskundeleraressen die informatica geven in het middelbaar - ik mocht indertijd mijn medeleerlingen helpen omdat ik veel te snel gedaan had met die kutoefeningetjes. Om maar te zwijgen over het taaltje dat we kregen : Elan (bah).
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan