|
Ένας λόγος
που η 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ποστολόπουλος Πάρις
Κωνσταντινίδης
Πάνος
|