Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Dersom man har behov for å knytte en handler lytter til et objekt som produserer/sender ut eventer kan en anonym klasse brukes. 
Dette gjelder spesielt dersom man ikke ønsker å spesifisere en helt ny klasse til å håndtere eventene en spesiell knapp sender ut.

 

Code Block
languagejava
titleSpecial ActionListener
linenumberstrue
public class MySpecialActionListener implements ActionListener {
	
	public void actionPerformed(ActionEvent e) {
		// Do something special	
	}
}
 
public class SomeClass implements ActionListener {
	
	button1.addActionListener(this);
	button2.addActionListener(this);
	specialButton.addActionListener(new MySpecialActionListener);
 
	public void actionPerformed(ActionEvent e) {
		// Do something
	}
}
 
 
 

 Eksempel v1

 

Code Block
languagejava
titleAnonymous ActionListener
linenumberstrue
public class SomeClass implements ActionListener {
 
	button1.addActionListener(this);
	button2.addActionListener(this);
	specialButton.addActionListener(
		ActionListener actList = new ActionListener() { 
			public void actionPerformed(ActionEvent e) {
		        // Do something special
    		}
	};
	}
	specialButton.addActionListener(actList);
 
	public void actionPerformed(ActionEvent e) {
		// Do something
	}
}

Eksempel v2

I v2 ser vi hvordan en anonym klasse kan deklareres og instansieres som en del av et uttrykk. Det er viktig å merke seg at det finnes flere "workarounds" for eksempelet ovenfor med hensyn på en knapp med en spesiell actionPerformed-metode, men det er greit å vite hva anonyme klasser er og kunne bruke de der det egner seg.

Inline implementasjon av grensesnitt

Deklarasjonen (og instansieringen) av den nye action listeneren på linje X i v2 av eksempelet ovenfor kan kalles en inline implementasjon av ActionListener-grensesnittet.
Om man vil deklarere en ny klasse som skal implementere et enkelt grensesnitt trenger man ikke nødvendigvis lage en egen klasse, men heller bruke en anonym klasse på samme måte som ovenfor.

Et annet eksempel:

 

Code Block
languagejava
titleRunable
linenumberstrue
public class SuperfastRunable implements Runable {
	
	// Forced to implement
	public void run() {
		// Do something
	}
 
	..
	..
}
 
public static void main(String[] args) {
	
	// code.. 	
	SuperfastRunable sfr = new SuperfastRunable();
	// code..
} 

 

 

Code Block
languagejava
titleAnonymous Runable
public static void main(String[] args) {
	 	
	// code..	

	Runable r = new Runable() {
		public void run() {
			// Do something
		}
	};
 
	// code..
} 

 

Som man igjen kan se, kan man spare seg for bryet med å lage en ny klasse om man bare trenger én instans av den på et/få sted(er) i koden. Pass dog på; mange anonyme klasser kan fort gjøre koden uoversiktlig.


Inline overridig av metoder ved arv

På samme måte som med implementasjon av grensesnitt, kan man også arve klasser inline ved å lage en anonym klasse. Dette kan være særlig nyttig dersom man f.eks. ønsker å lage én instans av en klasse, som skal override en eller få metoder. Se eksempel under.

 

Code Block
languagejava
titleSubclass TextField
TextField sum = new TextField() {
	@Override
	public void replaceText(int start, int end, String text) {
		if (!text.matches("[a-z, A-Z]")) {
			super.replaceText(start, end, text);                     
		}
		label.setText("Enter a numeric value");
		}
 
	@Override
	public void replaceSelection(String text) {
		if (!text.matches("[a-z, A-Z]")) {
			super.replaceSelection(text);
		}
	}
};

 

Eksempelet ovenfor viser hvordan en instans sum subklasser TextField og inline skriver over metodene replaceText og replaceSelection. Tekstfeltet sum er ment som et felt som bare vil ha input i form av numeriske verdier, og metoden som setter teksten forandres slik at det meldes fra dersom noen skriver tekst i feltet.

DENNE SIDEN ER UNDER UTVIKLING