Φωτογραφία ιορδάνης ασλανίδης
default constructor
από ιορδάνης ασλανίδης - Friday, 2 December 2011, 10:11 PM
 
γεια χαρά,

παρατηρώντας τους default constructor των κλάσεων Point, Circle και Rectangle στις σημειώσεις βλέπω ότι για τις μεταβλητές μέλη που δεν είναι πρωταρχικού τύπου κάνουμε new class:

center = new Point();

points = new Point[4];

έτσι και αλλιώς όλες οι αναφορές σε άλλες κλάσεις που είναι μεταβλητές μέλη δεν αρικοποιούνται σε null?? Ίσως σε περιπτώσεις όπως την τελευταία να έχει κάποια ιδιαίτερη σημασία γιατί σε arrays αναφορών σε κλάσεις καλό είναι να ορίζουμε το μέγεθος τους, αλλά π.χ. αν είχαμε ένα string σαν μεταβλητή μέλους θα έπρεπε να κάνουμε new String() ή να δώσουμε στην μεταβλητή μέλους τύπου string την αρχική τιμή null??
 
Φωτογραφία Νικόλαος Πανάγος
Απάντηση: default constructor
από Νικόλαος Πανάγος - Saturday, 3 December 2011, 9:04 AM
 
Γεια σου Ιορδάνη,

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

Π.χ. για το παραλληλόγραμμο γνωρίζω πως η μεταβλητή-μέλος points θα πρέπει να δείχνει σε έναν πίνακα τύπου Point μεγέθους 4. Δημιουργώ λοιπόν τον πίνακα αυτόν και κάνω τη διασύνδεση. Με τη δική μου λύση ο χρήστης μπορεί στη συνέχεια είτε να θέσει ένα ένα τα στοιχεία του πίνακα αυτού με την getPoints() είτε να δημιουργήσει έναν νέο πίνακα τύπου Point με τιμές που αντιστοιχούν σε ένα παραλληλόγραμμο και να καλέσει τη setPoints().

Αν και δεν υπάρχει στάνταρντ κανόνας για το πως θα πρέπει να αρχικοποιείς το αντικείμενό σου με τον default constructor λόγω του ότι κάθε περίπτωση είναι διαφορετική, είναι γενικά καλό μετά τη δημιουργία του αντικειμένου η κλήση των μεθόδων να μην επιστρέφει null για να αποφεύγονται τα NullPointerException. Αν το έκανα όπως λες, δηλαδή να αφήσω τις μεταβλητές-μέλη αναφορές σε άλλα αντικείμενα να αρχικοποιηθουν αυτόματα σε null, η getPoints() θα μου επέστρεφε null. Δεν είναι λάθος, θα πρέπει όμως ο χρήστης της κλάσης να είναι προσεκτικός.

ΝΠ
Φωτογραφία ιορδάνης ασλανίδης
Re: Απάντηση: default constructor
από ιορδάνης ασλανίδης - Saturday, 3 December 2011, 2:01 PM
 
Αντιλαμβάνομαι αυτό που λες και μου φαίνεται λογικό να υπάρχει όσο το δυνατόν ακριβέστερη δέσμευση μνήμης αλλά και αποφυγή των τιμών null, απλά μου είναι λίγο θολό λόγω μη εξοικείωσης. Επίσης, κάνοντας τον δικηγόρο του διαβόλου, αν εγώ για παράδειγμα αποφάσιζα ότι ο default constructor μιας κλάσης δίνει σαν αρχική τιμή μία default δομή την οποία θα άλλαζε αργότερα ο χρήστης μέσα από μια setter, αυτή η default δομή δεν θα έμενε "ορφανή" από αναφορές και θα περίμενε καρτερικά τον garbage coolector?? (και θα είχα μια τέτοια περίπτωση για κάθε αντικείμενο που δημιουργώ). Εκεί πιο πολύ μπερδεύομαι λίγο, άλλωστε πιο συγκεκριμένα στο παράδειγμά μας η Point[4] και έχει δεσμεύσει σωστά 4 block μνήμης τύπου Point (αλήθεια έχει??) και έχει τα στοιχεία της ορθώς να δείχνουν σε null περιμένοντας τον χρήστη να τα ορίσει.
Φωτογραφία Νικόλαος Πανάγος
Απάντηση: Re: Απάντηση: default constructor
από Νικόλαος Πανάγος - Saturday, 3 December 2011, 2:35 PM
 
Ιορδάνη όπως σου είπα δεν υπάρχει ένας standard κανόνας. Στο σενάριο που μου αναφέρεις ναι μεν θα γινόταν αυτό που λες αν έκανε τη χρήση που περιγράφεις, αλλα μπορώ να σου φέρω ως αντεπιχείρημα πως με τη δική μου λύση του δίνεται η δυνατότητα στον χρήστη:
  1. Να δημιουργήσει ένα αντικείμενο με τον default constructor αν δε γνωρίζει εκ των προτέρων τα σημεία του παραλληλογράμμου και στη συνέχεια οταν τα μάθει να τα θέσει είτε καλώντας την getPoints() είτε με τη setPoints(). Με τη δευτερη ναι, ένας πίνακας τεσσάρων στοιχείων τύπου Point θα είχε δεσμευτεί άσκοπα, σύνολο 32 bytes μνήμης. Την ερώτηση "αληθεια έχει" δεν την καταλαβαίνω... Φυσικά και έχει. Με το new δε δημιουργούμε αντικείμενα; Μπορεί να κάνει διαφορετικά;
  2. Αν γνωρίζει τα σημεία, να χρησιμοποιήσει τον constructor που δημιουργεί και αρχικοποιεί το αντικείμενο και όλα μια χαρα.

Με τη δική σου λύση γλιτώνεις την περιπτωση της σπατάλης του τεράστιου ποσού των 32 bytes μνήμης, αλλά δίνεις τη δυνατότητα στον χρήστη της κλάσης σου να χαρεί ένα ωραίο NullPointerException σε περίπτωση που καλέσει κατά λάθος την getPoints() πριν τη set. Αλήθεια για ποιον λόγο κάποιος θα δημιουργούσε αντικείμενα κατ' επανάληψη χωρίς να τα αρχικοποιεί;

Νομίζω πως το εξαντλήσαμε το θέμα... Bottomline, κάθε σχέδιο έχει θετικά και αρνητικά στοιχεία και κάθε περίπτωση τις δικές της ιδιαιτερότητες.

Φωτογραφία ιορδάνης ασλανίδης
Re: Απάντηση: Re: Απάντηση: default constructor
από ιορδάνης ασλανίδης - Saturday, 3 December 2011, 2:37 PM
 
οκ, ευχαριστώ!