Innføring i bruk av
interface
og
dynamisk klasse bruk

 
Dette er tiltenkt studenter som er kjent med C++ programmering, og vil lære om interface og/eller dynamisk bruk av klasser i Java.

Det er veldig vanskelig å vise noe visuellt som beskriver disse emnene, så mesteparten av innføringen vil bestå av dokumentasjon av et system som har disse emnene som hoved ingridiens.

En test applet som bruker interface og dynamisk klasse loading: ModuleBrowser applet
 

Først litt om interface i Java;

Et interface i Java er kort sagt en deklarasjon på hvilke metoder en klasse må definere hvis den implementerer interfacet. Det kan være veldig nyttig hvis en skal lage et system som bruker mange klasser som likner hverandre i oppførsel. En kan tenke seg et databaseprogram som bruker forskjellige typer sorterings rutiner. Hver av sorteringsrutinene kan da implementere et sorteringsinterface, slik at database progammet vet hva slags metoder den har å forholde seg til, uten nødvendigvis å vite hvordan metodene utfører arbeidet sitt.

En analog til dette i dagliglivet kan være et fjernsyns-apparat. Et slikt apparat vil alltid ha på/av knapp, volumkontroll og kanalvelger. Siden dette er felles på alle slike apparater, kan man si at de metodene (av/på mer lyd/mindre lyd, kanal opp/kanal ned) er et felles grensesnitt (interface) mot alle slike apparater. Hvordan disse metodene blir utført av TV-apparatet selv, trenger man ikke vite om, så lenge man får resultatene man vil ha. Vi kan i dette tilfellet si at et fjernsyns apparat implementerer et interface mot sluttbrukeren.

I systemet som er beskrevet nedenfor, brukes interface som et bindeledd mellom et menyskall og "ting" som kan plugges inn i menyskallet. Disse tingene, kaller vi her for moduler. Selve navnet 'moduler' har ikke noe med Java å gjøre i det hele tatt, vi har bare valgt å kalle det det.
 

Dynamisk klassebruk;

Når en lager et program, oppstår det av og til et ønske eller krav om å lage det fleksibelt nok til å kunne kjøre kode som ikke er direkte tilgjengelig når man kompilerer. Det kan for eksempel være som nevnt ovenfor, en sorteringsrutine. For å få dette til med appleter i Java, kan man gi hoved-appleten beskjed om hva nye kode-biter heter, slik at den kan laste de inn. I systemet under, hentes modulene inn dynamisk ved at menyskallet får beskjed om hvilke moduler som er tilgjengelige i HTML-koden.
 

Et system som bruker interface og dynamisk bruk av klasser;

Definisjon:

- En modul er en klasse som implementerer ModuleInterface interfacet;
import java.applet.*;
import java.awt.*;

interface ModuleInterface {
    public String getInfo();
    public String getTitle();
    public String getListname();
    public Applet getApplet();
}


Hoved-applet'en ligger i ModuleBrowser.java. Den leser inn parametere fra HTML-koden ModuleBrowser.html;

<APPLET code=ModuleBrowser.class width=640 height=480>
  <PARAM NAME=NumberOfModules VALUE="6">
  <PARAM NAME=NameOfModule1 VALUE="ModMinimum">
  <PARAM NAME=NameOfModule2 VALUE="ModLineBresenham">
  <PARAM NAME=NameOfModule3 VALUE="ModGraph">
  <PARAM NAME=NameOfModule4 VALUE="ModClock">
  <PARAM NAME=NameOfModule5 VALUE="ModRubik">
  <PARAM NAME=NameOfModule6 VALUE="ModStars">
</APPLET>
For å legge til en ny modul, oppdaterer man altså NumberOfModules og NameOfModule verdiene.

ModuleBrowser (MB) prøver å få tilgang til modulene for å få tak i navnet som skal stå i meny-lista ved å kjøre getListname() metoden, samtidig som den foretar feilsjekking. Info om hvilke moduler som er tilgjengelige, om MB evt. har klart å aksessere dem kommer frem i infofeltet på bunnen av MB i denne fasen. Dynamisk loading av klasser skjer med kallet;

try { module = (ModuleInterface)Class.forName(moduleName).newInstance(); }
hvor module er et objekt av typen ModuleInterface og moduleName er navnet på klassen hentet med getParameter().
 

For å legge til en ny modul til systemet må man gjøre følgende:

- Klassen som skal 'moduliseres' må implementere ModuleInterface.
- Klassen må definere metodene som er deklarert i ModuleInterface.
- Klassen må ligge i på samme nivå i filstrukturen som MB.
- ModuleBrowser.html må forandres som nevnt ovenfor.
Vanligvis er det veldig lett å konvertere en helt vanlig applet til en modul. Man trenger som regel bare å gjøre som ovenfor, og definere metodene som vist her:
// Interface implementation
public String getInfo() { return "info om denne modulen"; }
public String getTitle() { return "tittle til denne modulen"; }
public String getListname() { return "menyvalg navnet til denne modulen"; }
public Applet getApplet() { return this; }
Problemer som kan oppstå er størrelsen på den forhenværende appleten, og evt. parametere den måtte ha fra før. Dette må av og til forandres for at modulen skal virke tilfredsstillende i MB.
 

Kildekode:

ModuleBrowser.java Hovedprogram
ModuleInterface.java Interface

ModMinimum.java En modul med veldig lite i
ModLineBresenham.java En modul som demonstrerer linjetegning med bresenham algoritmen
ModGraph.java En modul som tegner en sinus kurve
ModClock.java En klokke i en tråd
ModRubik.java Rubiks kube
ModStars.java Stjerner
 

Klassefiler:

ModuleBrowser.class, ModuleInterface.class, ModMinimum.class, ModLineBresenham.class, ModGraph.class, ModClock.class, ModRubik.class, ModStars.class, ModStars$star.class.