java:interface

Εισαγωγικά

Κατά την ανάπτυξη προγραμμάτων είναι σημαντικό να είναι τυποποιημένος ο τρόπος αλληλεπίδρασης ανάμεσα σε διαφορετικά συστήματα. Η ύπαρξη ενός “συμβολαίου” το οποίο καθορίζει ακριβώς το πώς μπορεί μία κλάση να αλληλεπιδράσει με μια άλλη διευκολύνει την ανεξάρτητη ανάπτυξη κώδικα από διαφορετικούς προγραμματιστές.

Υπακούοντας στην παραπάνω αρχή, η Java εισάγει την έννοια της διεπαφής (interface). Τα interfaces στη Java λειτουργούν ως προ-συμφωνημένες διεπαφές μεταξύ προγραμματιστών. Κάθε interface τυπικά σχετίζεται με:

  1. τους προγραμματιστές που το χρησιμοποιούν: οι προγραμματιστές γράφουν την εφαρμογή τους ώστε να χρησιμοποιεί τις μεθόδους του interface, οι οποίες παρέχουν τη λειτουργικότητα που υποδεικνύει το interface αυτό.
  2. τους προγραμματιστές που το υλοποιούν: εφόσον θέλουν να ενσωματώσουν τη λειτουργικότητα που υποδεικνύει το interface σε συγκεκριμένες κλάσεις θα πρέπει να υλοποιήσουν τις μεθόδους του στις κλάσεις αυτές.

Από τα παραπάνω εξάγεται ότι το interface είναι μία προσυμφωνημένη διεπαφή η οποία δεσμεύει και τις δύο πλευρές, τόσο τους προγραμματιστές που το υλοποιούν, όσο και εκείνους που το χρησιμοποιούν. Παρακάτω θα δούμε την υποστήριξη των interfaces από τον compiler της Java και τους κανόνες που τα διέπουν.

Ως παράδειγμα, θεωρήστε ένα interface το οποίο ορίζει τη χρήση ενός χρονόμετρου (Timer). Όσοι επιθυμούν να υλοποιήσουν το χρονόμετρο θα πρέπει κατ' ελάχιστο να υλοποιήσουν τις παρακάτω μεθόδους:

  • setTimer: αρχικοποίηση του timer
  • startTimer: έναρξη του timer και
  • endTimer: τερματισμός του timer

Ας υποθέσουμε τώρα ότι ένας κατασκευαστής ηλεκτρικών συσκευών (κλιμαστιστικά, ψυγεία κ.α.) χρησιμοποιεί Java για τον αυτοματισμό τους και θέλει να χρησιμοποιεί μία κλάση τύπου Timer για τις συσκευές που κατασκευάζει προκειμένου να ενσωματώσει τη λειτουργία του χρονόμετρου. Για να το κάνει αυτό, μπορεί να χρησιμοποιήσει οποιαδήποτε κλάση είναι σύμφωνη με τον παραπάνω interface. Ας υποθέσουμε επίσης ότι υπάρχουν τουλάχιστον δύο διαφορετικές κλάσεις που υλοποιούν το συγκεκριμένο interface Timer.

Γνωρίζοντας ότι όλες οι εναλλακτικές κλάσεις που θα χρησιμοποιήσει θα υλοποιούν υποχρεωτικά το συγκεκριμένο interface, αρκεί να σχεδιάσει και να υλοποιήσει το λογισμικό του του ώστε να χρησιμοποιεί το interface αυτό. Σε αυτή την περίπτωση, σχεδιάζει και γράφει το λογισμικό με γνώμονα τον interface και όχι τη συγκεκριμένη κλάση που θα επιλέξει να χρησιμοποιήσει τελικά.

Υιοθετώντας την έννοια του interface και γράφοντας κώδικα που χρησιμοποιεί interfaces, γράφουμε κώδικα που είναι ανεξάρτητος από την οποιαδήποτε υλοποίηση των interfaces που χρησιμοποιούνται. Γενικότερα, ισχύει η αρχή ότι οι υλοποιήσεις ενός interface μπορεί να αλλάξουν, τα interfaces όμως συνιστάται να παραμένουν σταθερά.

Οποιοσδήποτε προγραμματιστής χρησιμοποιεί το παραπάνω interface δεν χρειάζεται να γνωρίζει το παραμικρό για την εσωτερική υλοποίηση των κλάσεων που το υλοποιούν. Η επιλογή της κλάσης που το υλοποιεί μπορεί να μεταβάλλεται χωρίς να επηρεάζεται ο κώδικας που το χρησιμοποιεί.

Αντιπαραθέστε τώρα την εναλλακτική μη ύπαρξης προσυμφωνημένων διεπαφών. Σε αυτή την περίπτωση κάθε πρόγραμμα ή ο κάθε κατασκευαστής θα έπρεπε να υλοποιεί την δική του κλάση για το χρονόμετρο, χωρίς να υπάρχει η δυνατότητα εύκολης χρήσης λογισμικού που προέρχεται από τρίτους.

Η προτυποποίηση που παρέχει ο μηχανισμός του interface είναι αυτή που επιτρέπει:

  1. την εύκολη και χωρίς σφάλματα επαναχρησιμοποίηση κώδικα σε διαφορετικά προγράμματα και
  2. την αλλαγή της υφιστάμενης υλοποίησης μιας κλάσης που υλοποιεί ένα interface, δίχως οι χρήστες του interface να έχουν γνώση για τις αλλαγές αυτές.
java/interface.txt · Last modified: 2017/03/31 10:50 by gthanos