JAVA ΕΝΟΤΗΤΑ 21 – PACKAGES AND ACCESS SPECIFIERS (Part 2)

 


ΕΙΣΑΓΩΓΗ

Στο σημερινό δωρεάν μάθημα Java, θα δούμε πως ακριβώς χρησιμοποιούνται τα packages σε συνδυασμό με τα access specifiers για να δημιουργήσουμε libraries.

WHAT IS A LIBRARY?

Πριν μπούμε σε λεπτομέρειες για το πώς δημιουργούμε την δική μας βιβλιοθήκη (library), νομίζω θα ήταν πιο χρήσιμο να εξηγήσουμε τι ακριβώς είναι μια βιβλιοθήκη.

Ας γυρίσουμε πίσω στην κλάση Taxes που είχαμε δημιουργήσει στην προηγούμενη ενότητα.

Taxes.java

package com.example.greetaxes;

public class Taxes {
    private double grossIncome; // class member variables
    private int dependents;

    public Taxes(double grossIncome, int dependents) {
        this.grossIncome = grossIncome;
        this.dependents = dependents;
    }

    public double getGrossIncome() {
        return this.grossIncome;
    }

    public void setGrossIncome(double grossIncome) {
        this.grossIncome = grossIncome;
    }

    public int getDependents() {
        return this.dependents;
    }

    public void setDependents(int dependents) {
        this.dependents = dependents;
    }

    public double calcTax() {
        double taxes = 0;
        if (this.grossIncome < 30000) {
            taxes = this.grossIncome * 0.05;
        } else {
            taxes = this.grossIncome * 0.06;
        }

        return taxes;
    }

}

Εδώ θα παρατηρήσουμε ότι η συγκεκριμένη κλάση δεν εξαρτάται από καμία άλλη κλάση (δηλαδή δεν δημιουργεί αντικείμενα από την Employee) οπότε λειτουργεί εντελώς αυτόνομα. Επίσης, σαν επιπλέον πλεονέκτημα, είναι το γεγονός ότι περιέχει μια πολύ χρήσιμη method, την calcTac( ), η οποία περιέχει τον αλγόριθμο που υπολογίζει τους φόρους ανάλογα με το ποσό που λαμβάνει ο εργαζόμενος σαν μισθό. Εδώ μπορείτε με ασφάλεια να υποθέσετε ότι ο αλγόριθμός υπολογισμού του φόρου μπορεί να μην είναι τόσο απλός όπως και ότι η κλάση μπορεί να περιέχει και άλλες χρήσιμες μεθόδους. Επίσης μπορεί να μην είναι η μόνη κλάση μέσα στο πρόγραμμα μας που περιέχει μεθόδους υπολογισμών.

Βρίσκουμε λοιπόν την λογική της συγκεκριμένης κλάσης πολύ χρήσιμη, και επιθυμούμε να τη χρησιμοποιήσουμε και σε άλλα projects. Πως όμως θα μεταφέρουμε την λειτουργία της κλάσης (ή των κλάσεων) σε ένα καινούργιο project? Ίσως μια γρήγορη απάντηση να είναι ότι απλά θα κάνουμε copy-paste τον κώδικα. Αλλά αυτό μπορεί να μην είναι εφικτό για εσάς, γιατί μπορεί να μην έχετε πρόσβαση στο προηγούμενο project για να αντιγράψετε τον κώδικα. Επίσης, πάντα υπάρχει η πιθανότητα λάθους σε τέτοιου είδους διαδικασίες ή ακόμα να θελήσετε να αλλάξετε τον αρχικό κώδικα της κλάσης και να δημιουργήσετε προβλήματα στην σωστή εκτέλεσή της. Ένας πιο ασφαλής τρόπος είναι να μετατρέψουμε αυτή τη κλάση (ή μια ομάδα κλάσεων) σε βιβλιοθήκη (Library) και να μοιραστούμε το Library με τα υπόλοιπα projects. Τι είναι όμως ένα Library?  Είναι απλά ένα jar αρχείο. Πως δημιουργούνται τα jar αρχεία? Αφού δημιουργήσουμε ένα Java Project και εκτελέσουμε την εντολή mvn install. Το jar θα είναι εκτελέσιμο? Όχι γιατί δεν περιέχει την main μέθοδο. Πως μπορούν τα άλλα projects να χρησιμοποιήσουν το jar που θα δημιουργήσουμε? Θα κάνουν import το jar στο δικό τους project και αμέσως μετά θα μπορούν να χρησιμοποιήσουν τις κλάσεις που προσφέρει το jar.


 
Οπότε σαν πρώτο βήμα αυτό που έχουμε να κάνουμε είναι να δημιουργήσουμε ένα καινούργιο Java Maven Project το οποίο θα περιέχει μόνο την κλάση Taxes. Ας δημιουργήσουμε ένα καινούργιο project με το όνομα library και ας γράψουμε μόνο την κλάση Taxes μέσα σε αυτό. Διαγράψτε την κλάση App και αμέσως μετά εκτελέστε την εντολή mvn clean και μετά mvn install για να δημιουργήσετε το jar.


Τώρα επιστρέφουμε πίσω στο EmployeeApp project και διαγράφουμε την κλάση Taxes. Φυσικά το πρόγραμμα μας θα παραπονεθεί για λάθη αλλά αυτά θα λυθούν όταν προσθέσουμε το jar library στην εφαρμογή EmployeeApp. Επίσης πηγαίνετε στην κλάση App και στην κλάση Employee και διαγράψτε τα import statements.



Τώρα αυτό που μας έχει απομείνει είναι να κάνουμε το project EmployeeApp να αναγνωρίσει το jar της βιβλιοθήκης library για να μπορεί να κάνει import την κλάση Taxes. Στο VS Code, αν δεν χρησιμοποιούσαμε maven ή κάποιο άλλο build tool, θα είχαμε την επιλογή κάνοντας δεξί κλικ επάνω στο project να επιλέξουμε ποιο εξωτερικό jar θα επιθυμούσαμε να προσθέσουμε στο project μας σαν εξωτερική βιβλιοθήκη. Τώρα που χρησιμοποιούμε Maven, θα πρέπει να δηλώσουμε αυτό το dependency μέσα στο POM.xml. Ανοίγουμε λοιπόν το POM.xml του EmployeeApp project και δηλώνουμε το library jar με τον εξής τρόπο:

    <dependency>
      <groupId>com.example</groupId>
      <artifactId>library</artifactId>
      <version>1.0-SNAPSHOT</version>
      <scope>system</scope>
      <systemPath>C:\TRAINING\Java\library\target\library-1.0-SNAPSHOT.jar</systemPath>
    </dependency>

Εκτελούμε πάλι mvn clean και mvn mvn install. Μην ανησυχείτε για τα λάθη που θα εμφανίσει η εντολή mvn install. Εκτελώντας όμως την εντολή, τώρα το project μας γνωρίζει που να αναζητήσει την κλάση Taxes.

Αν πάμε τώρα στην κλάση Employee και στην κλάση App και επιλέξουμε Quick Fix θα δούμε ότι η επιλογή com.example.Taxes εμφανίζεται. Πατάμε επάνω στην κλάση για να την κάνουμε import. Επαναλαμβάνουμε τα ίδια βήματα και για τις δύο κλάσεις για να εξαλείψουμε τα λάθη που εμφανίζονταν.






Το project μας τώρα εκτελείται χωρίς λάθη. Ξανά, ο μόνος τρόπος για να περάσουμε τις τιμές στο αντικείμενο είναι μόνο μέσα από τον constructor. Επειδή οι μεταβλητές έχουν οριστεί σαν private δεν έχουμε άμεση πρόσβαση σε αυτές.


Νομίζω ότι τώρα βλέπετε την χρησιμότητα να οργανώνουμε τις κλάσεις μας με τα packages και να ασφαλίζουμε διάφορα σημεία των κώδικα μας με τα access specifiers. Φυσικά, η εξασφάλιση αποφυγής λάθους δεν στηρίζεται μόνο στους access specifiers. Αργότερα θα δούμε πως συνδυάζονται και με τα interfaces αλλά και με τις Abstract κλάσεις.

 Πριν κλείσουμε το σημερινό δωρεάν μάθημα Java, καλό θα ήταν να γνωρίζουμε ότι επίσημες βιβλιοθήκες, όπως για παράδειγμα Hibernate, μπορούμε να τις βρούμε στο mvnrepository (Maven Repository: Search/Browse/Explore (mvnrepository.com)) και αφού αντιγράψουμε το dependency να το προσθέσουμε στο POM.xml του project μας.




Όταν καλέσουμε τις κλάσεις που ανήκουν σε αυτή την βιβλιοθήκη, τότε το quick fix θα μας προτείνει ποιο πακέτο να κάνουμε import για να μπορέσουμε να χρησιμοποιήσουμε την κλάση για την οποία ενδιαφερόμαστε.

Μην ξεχάσετε να κάνετε ένα μικρό donation έτσι ώστε αυτό το blog να μεγαλώσει ακόμα πιο πολύ και να έχει περισσότερες δυνατότητες στην online παράδοση δωρεάν μαθημάτων.

full-width

Post a Comment

0 Comments