Java Hellenic User Group logo

Αρχική Σελίδα
Αγορά Συζήτησης
Κείμενα/Βοηθήματα

Valid CSS!

Σύνθετα αντικείμενα (Wrapper Objects)

Ένας λόγος που η Java δεν είναι μία ακραιφνή αντικειμενοστραφή γλώσσα προγραμματισμού είναι η ύπαρξη πρωτογενών τύπων (primitive types) όπως int, long, boolean κλπ. Όμως όλοι αυτοί οι πρωτεγενείς τύποι αντιστοιχούνε και μπορούνε να μεταφραστούνε σε κάποιο ανάλογο τύπο αντικειμένου. Αυτά τα αντικέιμενα ονομάζονται wrapper objects ( μεταφραζόμενα  ίσως λίγο άστοχα και ως «περιτυλίγματα») και δεν είναι τίποτα άλλο από αντικείμενα που περιέχουνε μεταβλητές αναφοράς (instance variables) του αντίστοιχου πρωτογενή τύπου (με άλλα λόγια «περιτυλίγουνε» τον πρωτογενή τύπο σε ένα αντικείμενο). Αυτοί οι τύποι αντικειμένων παρέχουνε επίσης σταθερές (constants) και μεθόδους οι οποίες μας δίνουνε τη δυνατότητα να χειριστούμε τους πρωτογενείς τύπους.

Wrapper Objects

Ο αντίστοιχος αντικειμενοστραφής τύπος μίας πρωτογενούς μεταβλητής εκφράζεται στη Java με παραπλήσιο όνομα. Έτσι λοιπόν έχουμε τον αντίστοιχο Integer wrapper τύπο για int, τον αντίστοιχο Boolean για boolean, Long για long και ούτε καθ΄ εξής.Όλοι οι πρωτογενείς τύποι έχουνε το αντίστοιχο αντικείμενο. Δεν ισχύει όμως το ίδιο και για τα αντικείμενα. Υπάρχουνε πολλοί αντικειμενοστραφείς τύποι οι οποίοι δεν έχουνε έναν αντίστοιχο πρωτογενή. Για παράδειγμα ο τύπος Vector δεν έχει ανάλογο πρωτογενή όπως επίσης και ο τύπος Class. Ακόμα οποιοδήποτε τύπο δημιουργεί ο χρήστης δεν μπορεί να αντιστοιχεί σε κάποιον πρωτογενή.

Λόγω του ότι οι πρωτογενείς τύποι δεν είναι αντικείμενα και ο υπολογιστής μπορεί να τους χειριστεί γρηγορότερα αυτό οδηγεί σε μία ταχύτερη εφαρμογή. Η προκειμένη ποσότητα μνήμης που καταναλώνουνε οι πρωτογενείς τύποι είναι λιγότερη από την αντίστοιχη μνήμη που χρειάζονται τα ανάλογα αντικείμενα, οπότε η χρήση πρωτογενών τύπων αποφέρει και εξοικονόμηση μνήμης. Παρόλα αυτά τα πλεονεκτήματα που μας προσφέρει η χρήση πρωτογενών τύπων πολλές φορές είναι απαραίτητο να μπορούμε να τελέσουμε κάποιες πράξεις πάνω σε αυτούς τους τύπους. Για παράδειγμα μπορεί να θέλουμε να βρούμε την αντίστοιχη byte ή δεκαεξαδική τιμή ενός ακεραίου. Προσέτι, υπάρχουνε τύποι αντικειμένων που δουλεύουνε μόνο με αντικείμενα και όχι με πρωτογενείς τύπους. Αν έχουμε ένα αντικείμενο τύπου LinkedList και θέλουμε να το εποικίσουμε με ακέραιους αριθμούς θα πρέπει να μετατρέψουμε τους ακέραιους στα αντίστοιχα αντικείμενα από τη στιγμή που η LinkedList μπορεί να περιέχει μόνο αντικείμενα και όχι πρωτογενείς τύπους.

Τα wrapper αυτά αντικείμενα είναι κανονικές Java κλάσεις και δημιουργούνται ακριβώς όπως δημιουργούνται και οι υπόλοιπες κλάσεις, χρησιμοποιώντας τη λέξη-κλειδί new ή όταν γίνεται μία στατική αναφορά πάνω τους.

Ένα μικρό παράδειγμα

Το παρακάτω παράδειγμα μας δείχνει πως μπορούμε να δημιουργήσουμε ορισμένα wrapper objects με βάση κάποιες μεταβλητές πρωτογενών τύπων .Επίσης υπάρχουν λίγα παραδείγματα από χαρακτηριστικές μεθόδους που μας προσφέρουν οι κλάσεις αυτές. Για έναν πλήρη οδηγό στις μεθόδους αυτές , θα ανατρέξετε στο http://java.sun.com/j2se/1.4.1/docs/api/.

  public void demoWrappers(){
 
    //initialization of primitive types
    int anInt =56;
    float aFloat = 123;
    double aDouble = 11234;
    byte aByte = 2;
    long aLong = 123453;
 
    //initialization of wrapper objects using the primitives above
    Integer aWrapInt = new Integer(anInt);
    Float aWrapFloat = new Float(aFloat);
    Double aWrapDouble = new Double(aDouble);
    Byte aWrapByte = new Byte(aByte);
    Long aWrapLong = new Long(aLong);
 
    /*
     demonstations of some wrapper objects methods available in Java API
    */
 
    //get the value of the wrapper object and store it in a primitive type
    //variable
    int aSecondInt = aWrapInt.intValue();
 
    //use of Integer class methods in order to parse the int value of an int
    int aThirdInt = Integer.parseInt("123");
 
    //get the value of the wrapper object and store it in a primitive type
    //variable
    float aSecondFloat = aWrapFloat.floatValue();
 
    //parse the value of the wrapper object transform it to another type ,
    //and save it to an appropriate variable
     long aSeconLong = aWrapFloat.longValue();
 
     //use of equals
     //it is a very important method that all wrapper objects implement
     if ( new Integer(4).equals(aWrapInt) )
     {
       //this is false
       System.out.println("These 2 Integers are equal");
     }
     else
     {
       //this is true , the Integers dont have the same value
       System.out.println("These 2 Integers are NOT equal");
     }
  }//end of method
 

Aποστολόπουλος Πάρις
Κωνσταντινίδης Πάνος


  Get Java Now!