pbp Δημοσ. 2 Ιανουαρίου 2012 Δημοσ. 2 Ιανουαρίου 2012 Γεια σας, Μήπως μπορείτε να μου πείτε ποια είναι η διαφορά του να κανεις > Class className{ int[] table = new int[10]; // olo eksw apo ton constructor className(){...} } και int[] table; > class className{ int[] table; // eksw apo ton constructor ClassName() { table = new int[10]; ... } } Ευχαριστώ.
insomania Δημοσ. 2 Ιανουαρίου 2012 Δημοσ. 2 Ιανουαρίου 2012 Για το πρώτο κομμάτι δεν σου πετάει σφάλμα? Αν, οχι πρακτικά εχεις το ίδιο αποτέλεσμα (αν και αυτό επιτυγχάνεται με διαφορετικό μηχανισμό) Πάντως ο δεύτερος πρέπει να είναι ο καλύτερος τρόπος,αφού η δουλεια των constructors είναι να αρχικοποιούν τα πεδία των κλάσεων.
pbp Δημοσ. 2 Ιανουαρίου 2012 Μέλος Δημοσ. 2 Ιανουαρίου 2012 Για το πρώτο κομμάτι δεν σου πετάει σφάλμα? Αν, οχι πρακτικά εχεις το ίδιο αποτέλεσμα (αν και αυτό επιτυγχάνεται με διαφορετικό μηχανισμό) Πάντως ο δεύτερος πρέπει να είναι ο καλύτερος τρόπος,αφού η δουλεια των constructors είναι να αρχικοποιούν τα πεδία των κλάσεων. Στο πρώτο όχι δεν μου πετάει σφάλμα... To Θέμα μου είναι ότι έχω κάνει κάτι copy constructors και αν κάνω new μέσα στον constructor την στιγμή του copy μου πετάει σφάλμα ενώ με την πρώτη περίπτωση (το new έξω από τον constructor) όλα δουλεύουν κανονικά. Άρα κάποια διαφορά θα υπάρχει.
moukoublen Δημοσ. 2 Ιανουαρίου 2012 Δημοσ. 2 Ιανουαρίου 2012 Λογικό είναι. Πρέπει και στον copy constructor να αρχικοποιήσεις τον πινακα πριν γράψεις μέσα σε αυτόν. Απλά ένα initialization που γίνεται τη στιγμή της δήλωσης λειτουργεί πριν απ όλους και για όλους τον κατασκευαστές. Πάντως προσωπικά θα απέφευγα τον copy constructor. Μιας και η Java λειτουργεί μονο με αναφορές θα προτιμούσα κάτι τέτοιο. Έτσι γλιτώνεις έναν constructor > public class MyTest { int[] table; MyTest(){ this.table = new int[10]; } public MyTest copy(){ return MyTest.copy(this); } public static MyTest copy(MyTest toCopy){ MyTest toRet = new MyTest(); //copy timwn return toRet; } }
pbp Δημοσ. 2 Ιανουαρίου 2012 Μέλος Δημοσ. 2 Ιανουαρίου 2012 Λογικό είναι. Πρέπει και στον copy constructor να αρχικοποιήσεις τον πινακα πριν γράψεις μέσα σε αυτόν. Απλά ένα initialization που γίνεται τη στιγμή της δήλωσης λειτουργεί πριν απ όλους και για όλους τον κατασκευαστές. Πάντως προσωπικά θα απέφευγα τον copy constructor. Μιας και η Java λειτουργεί μονο με αναφορές θα προτιμούσα κάτι τέτοιο. Έτσι γλιτώνεις έναν constructor > public class MyTest { int[] table; MyTest(){ this.table = new int[10]; } public MyTest copy(){ return MyTest.copy(this); } public static MyTest copy(MyTest toCopy){ MyTest toRet = new MyTest(); //copy timwn return toRet; } } Δηλαδή στο παράδειγμα που μου έδωσες Αν μεταβληθούν στη συνέχεια οι τιμές του ενός αντικειμένου δεν θα μεταβληθούν και του άλλου?
moukoublen Δημοσ. 2 Ιανουαρίου 2012 Δημοσ. 2 Ιανουαρίου 2012 Στην συγκεκριμένη περίπτωση που είναι int αν αντιγράψεις τον πινακα στοιχειο προς στοιχειο (εκεί που λέει με σχόλια copy τιμών), όχι. Θα έχεις δυο διαφορετικούς πίνακες Αν όμως είναι πινακας αντικειμένων τότε θα αντιγραφουν οι αναφορές και θα δείχνουν στα ίδια αντικείμενα Για αυτό δεν έχει πολύ νόημα και λειτουργική σημασία ο copy constructor σε γλώσσες σαν τη java. Τώρα, δε ξέρω μήπως υπάρχουν κάποιες τεχνικές, μέσω serialization μηχανισμών, να αντιγραφείς εύκολα ένα instance αντικειμενου.
nplatis Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 Συγγνώμη, αλλά τι ουσιαστική διαφορά έχει αυτή η στατική μέθοδος που προτείνεις από έναν copy constructor;
Aztec Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 Πρέπει και στον copy constructor να αρχικοποιησεις για την δευτερη περιπτωση.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα