De basis van een interface

Het maken van een Interface gebeurt zoals je al kon raden met het keyword interface waar we bij objecten-types class zouden gebruiken. Vervolgens plaatsen we hierin één of meerde functies die nog niet zijn afgewerkt, methoden zonder een codeblok. De functies krijgen wel al een naam return-type en parameters maar geen uitvoering. Een functie zonder codeblok is een abstracte functie. Het heeft, naar analogie van een abstract schilderij, geen inhoud(met een korreltje zout). En dit laten we weten door het sleutelwoord abstract te gebruiken.

De syntax gaat als volgt:

public abstract interface InterfaceName extends SuperInterface1, SuperInterface2

We omschrijven even de sleutelwoorden:

SleutelwoordOmschrijving
publicHet toegangsniveau van de interface, dit kan public of package zijn.
abstractGeeft aan dat de methoden van de interface abstract zijn. Een interface is altijd abstract en daardoor is het niet verplicht om het sleutelwoord abstract te gebruiken, impliciet zal het er staan ook al schrijf je het niet.
interface InterfaceNameDe naam van de interface. (HigherCamelCase)
extends SuperInterface1, SuperInterface2Optioneel kan een interface afgeleid worden van, of overerven van 1 of meerdere (super-)interfaces. Meerdere superinterfaces worden dan gescheiden door een komma.

We maken net als bij een klasse een nieuw .java bestand/interface aan met de naam van onze interface. Ik neem als voorbeeld de thermostaat.

Central Heating Thermostat

Een eenvoudige thermostaat laat ons toe de gewenste temperatuur van ons huis in te stellen via een draaiknop. Hoe de mechaniek van de draaiknop functioneert of de achterliggende electronica is niet van belang.

Ik noem de interface thermostat-interface of kort IThermostat. Dit komt in het bestand IThermostat.java:

public interface IThermostat{
   public abstract void setTemperature( int degreesCelcius );
}

Van ons grondplan, onze interface IThermostat, is geen instantie te maken. Dit is net zoals bij een abstracte klasse, omdat er functionaliteiten niet afgewerkt zijn (abstract), in deze interface is er geen codeblok bij de methode setTemperature. Het is dus noodzakelijk deze functionaliteiten toe te voegen door overerving om er een instantie van te kunnen maken.

Door middel van het sleutelwoord extends konden we maar 1 class overerven in een overervende klasse (onderliggende overervingen niet meegerekend). Echter bij een interface is deze limitatie er niet. Je hebt wel het sleutelwoord implements nodig als een klasse overerft van een interface.

Voorbeeld:

public class MyClass1 extends MyClass2, MyClass3{
   //...
}

Bovenstaande code geeft een compile error. De onderstaande code niet.

public class MyClass implements MyInterface1, MyInterface2, MyInterface3{
   //...
}

public interface SomeInterface extends MyInterface1, MyInterface2{
   //...
}

Verder heeft een interface wel nog bijna alle statische mogelijkheden zoals een klasse. Je kan (aan het grondplan) statische functionaliteiten toevoegen, en je kan er statische, maar constante, variabelen in steken, we zullen dit in het volgende hoofdstuk verder bespreken.

Een implementatie van deze interface gebeurt met het sleutelwoord extends voor overervende interfaces of met het keyword implements voor overervende klassen, we geven nog enkele correcte voorbeelden:

public interface IAdvancedThermostat extends IThermostat{
   public void setNightTimeTemperature( int degreesCelcius );
   public void setNightTime( int startHour, int startMinute, int endHour, int endMinute );
}

Bovenstaande code maakt een geavanceerde thermostaat en deze voegt abstracte 2 methoden toe, om de temperatuur en tijd van de nacht in te stellen.

Onderstaande code is een implementatie van de interface Ithermostat. Het enige dat nog ontbreekt aan de code van de klasse SimpleThermostat is de functionaliteit die de temperatuur meet en beslist of de verwarming aan- of uitgeschakeld moet worden. Van de klasse SimpleThermostat is op dit moment wel een instantie te maken.

public class SimpleThermostat implements IThermostat{
   int preferredTemperature;

   public void setTemperature( int degreesCelcius ){
      preferredTemperature = degreesCelcius;
   }

   // ...
}