This is an old revision of the document!
Στην γλώσσα προγραμματισμού Java μπορούμε να αρχικοποιήσουμε την τιμή ενός πεδίου στο σώμα της κλάσης, όπως παρακάτω.
public class BedAndBreakfast { // initialize to 10 public static int capacity = 10; // initialize to false private boolean full = false; }
Η παραπάνω μέθοδος αφορά στατικά (static) και μη στατικά πεδία, προϋποθέτει όμως ότι η ανάθεση της τιμής μπορεί αν γίνει μόνο με μία εντολή (όπως παραπάνω). Πιο σύνθετες μέθοδοι ανάθεσης (π.χ. πρέπει να γίνει αρχικοποίηση ενός πίνακα) μπορούν να γίνουν μέσα στους κατασκευαστές τις κλάσης, μόνο αν μιλάμε για μη στατικά πεδία. Η αρχικοποίηση στατικών πεδίων δεν μπορεί να γίνει μέσα στους κατασκευαστές.
Για την αρχικοποίηση πεδίων εκτός από τους κατασκευαστές έχουμε τις εξής επιλογές:
To static initialization block είναι ένα τμήμα κώδικα τοποθετημένο μέσα σε παρενθέσεις { } που προσδιορίζεται από το keyword static, όπως παρακάτω:
static { ... }
Κάθε κλάση μπορεί να έχει περισσότερα από ένα static initialization blocks, τα οποία μπορεί να βρίσκονται οπουδήποτε μέσα στο σώμα της. Τα block αυτά καλούνται κατά την αρχικοποίηση της κλάσης με τη σειρά που εμφανίζονται στο σώμα της.
Εναλλακτικά των static initialization blocks μπορούν να χρησιμοποιηθούν στατικές μέθοδοι, όπως παρακάτω
class MyClass { public static varType myVar = initializeClassVariable(); private static varType initializeClassVariable() { // initialization code goes here } }
Το πλεονέκτημα των στατικών μεθόδων είναι ότι μπορούν να επαναχρησιμοποιηθούν σε περίπτωση που χρειαστεί να επανα-αρχικοποιηθεί η στατική μεταβλητή της κλάσης.
Τα initialization blocks ομοιάζουν με τα static initialization blocks με την διαφορά ότι δεν περιέχουν το keyword static. Και αυτά καλούνται με την σειρά που εμφανίζονται στο σώμα της συνάρτησης με την διαφορά ότι καλούνται μέσα σε κάθε κατασκευαστή της κλάσης, όποτε αυτός εκτελείται. Τα initialization blocks μπορούν να χρησιμοποιηθούν για να διαμοιραστεί κώδικας μεταξύ διαφορετικών κατασκευαστών (εναλλακτικά μπορείτε να χρησιμοποιήσετε μία βοηθητική συνάρτηση).
Παρακάτω δίνεται ένα παράδειγμα χρήσης final μεθόδου για την αρχικοποίηση ενός μη στατικού πεδίου. Μία final μέθοδος δεν μπορεί να γίνει override από μία άλλη μέθοδο με το ίδιο prototype κατά την διαδικασία της κληρονομικότητας (θα το δούμε παρακάτω, όταν θα εξετάσουμε σε βάθος την κληρονομικότητα).
class Whatever { private varType myVar = initializeInstanceVariable(); protected final varType initializeInstanceVariable() { // initialization code goes here } }
Προφανώς η μέθοδος μπορεί να επαναχρησιμοποιηθεί και σε άλλα σημεία του κώδικα της κλάσης. Η χρήση final μεθόδου κρίνεται απαραίτητη για την αρχικοποίηση μη στατικών πεδίων, διότι σε περίπτωση ύπαρξης κληρονόμων της κλάσης μπορεί να υπάρξουν προβλήματα.
public class Bicycle { private int cadence; private int gear; private int speed; private int id = initializeId(); private static int numberOfBicycles = initNumberOfBicycles(); public Bicycle(int startCadence, int startSpeed, int startGear){ gear = startGear; cadence = startCadence; speed = startSpeed; id = ++numberOfBicycles; } public int getID() { return id; } // static method for initializing static variable. private static int initNumberOfBicycles() { System.out.println("initialize numberOfBicycles in static method"); return 0; } //static initialization block static { System.out.println("initialize numberOfBicycles in static block"); numberOfBicycles = 0; } //non-static initialization block { System.out.println("initialize objectId in block"); id = 100; } //final method private final int initializeId() { System.out.println("initialize objectId in final method"); return 200; } public static int getNumberOfBicycles() { return numberOfBicycles; } public void setCadence(int newValue) { cadence = newValue; } public void setGear(int newValue) { gear = newValue; } public void applyBrake(int decrement) { speed -= decrement; } public void speedUp(int increment) { speed += increment; } public String toString(String objName) { return "["+objName+"."+id+"] Cadence: "+cadence+", Gear: "+gear+", Speed: "+speed; } public void printState(String objName) { System.out.println( toString(objName) ); } public static void main(String args[]) { Bicycle myBike = new Bicycle(1, 4, 2); Bicycle yourBike = new Bicycle(2, 3, 3); myBike.printState("myBike"); yourBike.printState("yourBike"); System.out.println("Number of bicycles: "+ getNumberOfBicycles()); } }
| Προηγούμενο: Στατικές μεταβλητές και μέθοδοι | Επόμενο: Πακέτα στη γλώσσα προγραμματισμού Java |