12.5. Interfaces i standardbibliotekerne

Interfaces bliver brugt i vid udstrækning i standardbibliotekerne, og mange steder benyttes polymorfi til at gøre det muligt at lade systemet arbejde på programmørens egne klasser.

I det følgende vil vi se nogle eksempler på at implementationen af et interface fra standardbiblioteket gør, at vores klasser passer ind i systemet på forskellig måde.

12.5.1. Sortering med Comparable

Hvis et objekt implementerer Comparable-interfacet skal det definere metoden:


  public int compareTo(Object obj)

For eksempel:


public class Element implements Comparable
{ 
  int x;

  public Element(int x1)
  {
    x = x1;
  }

  public String toString()
  {
    return "element"+x;
  }

  public int compareTo(Object obj)      // kræves af Comparable
  {
    Element andetElement = (Element) obj;// typekonverter først til Element

    if (x == andetElement.x) return 0;  // dette elem. og obj har samme plads
    if (x  > andetElement.x) return 1;  // dette element kommer efter obj
    else return -1;                // dette element kommer før obj
  }
}

Interfacet giver standardbibliotekerne mulighed for at sammenligne objekter og sortere dem i forhold til hinanden.

Sortering kan bl.a. ske ved at kalde metoden Collections.sort() med en vektor af objekter, der implementerer Comparable.


import java.util.*;
public class BrugElementer
{
  public static void main(String args[])
  {
    Vector liste = new Vector();
    liste.addElement( new Element(5));
    liste.addElement( new Element(3));
    liste.addElement( new Element(13));
    liste.addElement( new Element(1));

    System.out.println("før: "+liste);
    Collections.sort(v);    
    System.out.println("efter: "+liste);
  }
}

Resultatet bliver:


før: [element5, element3, element13, element1]
efter: [element1, element3, element5, element13]

sort() vil kalde compareTo() på vores objekter for at ordne dem i rækkefølge. Havde vores objekter ikke implementeret Comparable, ville der opstå en køretidsfejl, da systemet så ikke havde nogen grænseflade, hvorigennem det kunne undersøge, hvordan elementerne skal ordnes.

12.5.2. Flere tråde med Runnable

Hvis man vil bruge flere tråde (processer, der kører samtidigt i baggrunden) i sit program, kan dette opnås ved at implementere interfacet Runnable og definere metoden run(). Derefter opretter man et trådobjekt med new Thread(objektDerImplementererRunnable). Når tråden startes (med trådobjekt.start()), vil det begynde en parallel udførelse af run()-metoden i objektDerImplementererRunnable.

Dette vil blive behandlet i Kapitel 17, Flertrådet programmering.

12.5.3. Lytte til musen med MouseListener

Når man programmerer grafiske brugergrænseflader, kan det være nyttigt at kunne få at vide, når der er sket en hændelse, f.eks. at musen er klikket et sted.

Dette sker ved, at man definerer et objekt (lytteren), der implementerer MouseListener-interfacet. Den har forskellige metoder, f.eks. mouseClicked(), der er beregnet på et museklik.

Lytteren skal registreres i en grafisk komponent, f.eks. en knap eller en applet. Det gøres ved at kalde komponentens addMouseListener()-metode med en reference til lytteren. Derefter vil, hver gang brugeren klikker på komponenten, lytterens mouseClicked() blive kaldt.

Analogt findes lyttere til tastatur, musebevægelser, tekstfelter, kontroller osv. I Kapitel 11 om grafiske brugergrænseflader og hændelser er disse ting beskrevet nærmere.