Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

En anonym klasse er en klasse som deklareres og instansieres i en annen, altså er den av typen nøstet klasse. Klassen deklareres og instansieres i et uttrykk, og har noen forholdsvis definere bruksområder.et uttrykk, og er enten en subklasse av en annen klasse eller så implementerer den et (og bare ett) grensesnitt. Hensikten med en anonym klasse vil ofte være en "quick-fix"/hurtig-implementasjon av en instans som implementerer et grensesnitt eller en klasse man vil gjøre forandringer på. Dette blir forhåpentligvis litt mer begripelig med noen eksempler.

 

Code Block
languagejava
titleSyntax Subclassing
// Usual instantiation of class
SomeClass instanceOfSomeClass = new SomeClass();
 
// Instantiation and declaration of 
// an anonymous class
SomeClass myAnonymousClass = new SomeClass() {
	
	private int newField;
 
	@Override
	public void someMethod() { ... }
 
	public void newMethod() { ... }
 
};
 
// myAnonymousClass is a subclass of SomeClass

 

 

Code Block
languagejava
titleSyntax interface
// Usual usage of interface
 
public class SomeClass implements SomeInterface { ... }
 
SomeInterface instance = new SomeClass();
 
// Instantiation and declaration of an anonymous class
 
SomeInterface myAnonymousClass = new SomeInterface() {
	
	@Override
	public void requiredMethod1 { ... }
	@Override
	public void requiredMethod2 { ... }		
};
 
// myAnonymousClass implements the required methods
// without beeing an instance of another class 

 

Anonyme klasser til håndtering av hendelser

...

 

Code Block
languagejava
titleSpecial ActionListener
linenumberstrue
// NOT USE OF ANONYMOUS CLASS
 
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
// USE OF ANONYMOUS CLASS
 
public class SomeClass implements ActionListener {
 
	button1.addActionListener(this);
	button2.addActionListener(this);
	
	ActionListener actList = new ActionListener() { 
			
			public void actionPerformed(ActionEvent e) {
		        // Do something special
    		}
	};
 
	// actList is now an anonymous class
	
	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 segher brukes anonyme klasser som en mulig løsning.

Inline implementasjon av grensesnitt

Deklarasjonen (og instansieringen) av den nye action listeneren actionlisteneren på linje X8-13 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.

...

 

Code Block
languagejava
titleRunableRunnable
public class SuperfastRunableSuperfastRunnable implements RunableRunnable {
	
	// ForcedRequired to implement
	 public void run() {
		 // Do something
	 }
}
public static void main(String[] args) {
	
	// code..
	
	SuperfastRunableSuperfastRunnable sfr = new SuperfastRunableSuperfastRunnable();
	
	// code..
}

 

 

 

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

	RunableRunnable r = new RunableRunnable() {
		
		// Required to implement
		public void run() {
			// Do something
		}
	};
 
	// code..
} 

 

 

Som man igjen kan se, Igjen 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.

...

Eksempelet ovenfor viser hvordan en instans sum 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 den varsler dersom noen skriver tekst i feltet.DENNE SIDEN ER UNDER UTVIKLING