pbp Δημοσ. 19 Οκτωβρίου 2011 Δημοσ. 19 Οκτωβρίου 2011 Γεια σας, Μήπως μπορείτε να μου πείτε πως μπορώ να καλέσω τον κατασκευαστή μιας κλάσης μέσα στην ίδια του την κλάση, μέσω μιας μεθόδου?
pbp Δημοσ. 19 Οκτωβρίου 2011 Μέλος Δημοσ. 19 Οκτωβρίου 2011 >super(); //ή με τα ορισματα που θες Μα δεν έχω κληρονομικότητα εδώ. Έστω ας πούμε οτι έχω: > class A { int temp public A(int temp) { this.temp=temp; } public void method(int temp) { //εδώ θέλω να καλέσω τον κατασκευαστή Α. } }
Επισκέπτης Δημοσ. 19 Οκτωβρίου 2011 Δημοσ. 19 Οκτωβρίου 2011 Καλησπέρα, Ο constructor (κατασκευαστής) δεν καλείται σαν μια κοινή μέθοδο μιας κλάσσης αλλά αυτόματα κατά τη δημιουργία μιας μεταβλητής της συγκεκριμένης κλάσσης (π.χ. - A a = new A(); -). Αυτό που θα έκανα στο παράδειγμά σου (αν θέλω να αρχικοποιώ κάποιες μεταβλητές όπως σε ενα καινούριο αντικείμενο) είναι να ορίσω μια νέα μέθοδο init(); Συνεπώς: > class A { int temp; public A(int temp) { init(temp); } public void init(int temp) { this.temp=temp; } public void method(int temp) { //εδώ θέλω να καλέσω τον κατασκευαστή Α. init(temp); } }; Βέβαια, έχω χρόνια να αγγίξω Java κώδικα, ελπίζω να τα θυμάμαι καλα!
Timonkaipumpa Δημοσ. 19 Οκτωβρίου 2011 Δημοσ. 19 Οκτωβρίου 2011 Γεια σας, Μήπως μπορείτε να μου πείτε πως μπορώ να καλέσω τον κατασκευαστή μιας κλάσης μέσα στην ίδια του την κλάση, μέσω μιας μεθόδου? Τι ακριβώς θες να κάνεις; Όπως έχεις ορίσει την "method", το νέο instance απλά θα δημιουργείται και θα μένει εκεί. Μόλις βγεις από την μέθοδο θα χάνεται (θα μαζεύεται από τον garbage collector την επόμενη φορά που θα κλιθεί από την VM). Εάν θες να ελέγχεις την δημιουργία ενός instance, τότε θα πρέπει να έχεις ως private τον constructor και να τον καλείς από μία άλλη μέθοδο η οποία θα επιστρέφει ένα instance τύπου της κλάσης. Πες τι ακριβώς θες να κάνεις να βρεθεί η λύση.
pbp Δημοσ. 20 Οκτωβρίου 2011 Μέλος Δημοσ. 20 Οκτωβρίου 2011 Τι ακριβώς θες να κάνεις; Όπως έχεις ορίσει την "method", το νέο instance απλά θα δημιουργείται και θα μένει εκεί. Μόλις βγεις από την μέθοδο θα χάνεται (θα μαζεύεται από τον garbage collector την επόμενη φορά που θα κλιθεί από την VM). Εάν θες να ελέγχεις την δημιουργία ενός instance, τότε θα πρέπει να έχεις ως private τον constructor και να τον καλείς από μία άλλη μέθοδο η οποία θα επιστρέφει ένα instance τύπου της κλάσης. Πες τι ακριβώς θες να κάνεις να βρεθεί η λύση. Έχω κάνει αυτό πχ: >package rectangular; public class Rectangular { private int width; private int length; public Rectangular(int width, int length) { this.width = width; this.length = length; } public int getWidth() { return width; } public int getLength() { return length; } public int Emv() { return width*length; } public int Perimeter() { return (width+length)*2; } public void setWidth(int width) { this.width = width; } public void setLength(int length) { this.length = length; } } Θέλω να κάνω το ίδιο πράγμα ακριβώς απλά οι μέθοδοι που θα επιστρέφουν την περίμετρο και το εμβαδό δεν θέλω να την υπολογίζουν, αλλά αλλά απλά την επιστρέφουν. Δηλαδή κάπως ετσι: >/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package rectangular; public class Rectangular2ndWay { private int width; private int length; private int emv; private int perimeter; public Rectangular2ndWay(int width, int length) { this.width = width; this.length = length; emv = width*length; perimeter = (width+length)*2; } public int getWidth() { return width; } public int getLength() { return length; } public int getEmv() { return emv; } public int getPerimeter() { return perimeter; } public void setWidth(int width) { this.width = width; emv = length*width; perimeter = (length+width)*2; //new Rectangular2ndWay(width,length); } public void setLength(int length) { this.length = length; emv = length*width; perimeter = (length+width)*2; //new Rectangular2ndWay(width,length); } } Μόνο που δεν θέλω να επαναλαμβάνεται ο κώδικας μου. Γι αυτο προσπαθώ να καλέσω τον κατασκευαστή. ΜΑΙΝ ---- >/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package rectangular; public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { Rectangular rectangular1 = new Rectangular(10,20); System.out.println("mikos: " + rectangular1.getLength()+ " " + "platos: " + rectangular1.getWidth()); System.out.println("Emvado: " + rectangular1.Emv()); System.out.println("Perimetros: " + rectangular1.Perimeter()); System.out.println("-"); rectangular1.setLength(1); rectangular1.setWidth(2); System.out.println("mikos: " + rectangular1.getLength()+ " " + "platos: " + rectangular1.getWidth()); System.out.println("Emvado: " + rectangular1.Emv()); System.out.println("Perimetros: " + rectangular1.Perimeter()); System.out.println("\n"); Rectangular2ndWay rectangular2 = new Rectangular2ndWay(10,20); System.out.println("mikos: " + rectangular2.getLength()+ " " + "platos: " + rectangular2.getWidth()); System.out.println("Emvado: " + rectangular2.getEmv()); System.out.println("Perimetros: " + rectangular2.getPerimeter()); System.out.println("-"); rectangular2.setLength(1); rectangular2.setWidth(2); System.out.println("mikos: " + rectangular2.getLength()+ " " + "platos: " + rectangular2.getWidth()); System.out.println("Emvado: " + rectangular2.getEmv()); System.out.println("Perimetros: " + rectangular2.getPerimeter()); } }
moukoublen Δημοσ. 20 Οκτωβρίου 2011 Δημοσ. 20 Οκτωβρίου 2011 Κάτι τέτοιο; > public class Rectangular2ndWay { private int width; private int length; private int emv; private int perimeter; public Rectangular2ndWay(int width, int length) { this.width = width; this.length = length; doTheJob(); } public int getWidth() { return width; } public int getLength() { return length; } public int getEmv() { return emv; } public int getPerimeter() { return perimeter; } public void setWidth(int width) { this.width = width; doTheJob(); } public void setLength(int length) { this.length = length; doTheJob(); } private void doTheJob(){ emv = length*width; perimeter = (length+width)*2; } } Κάτι τέτοιο;
Timonkaipumpa Δημοσ. 20 Οκτωβρίου 2011 Δημοσ. 20 Οκτωβρίου 2011 Ακριβώς ό,τι έγραψε ο moukoublen. Μόνο που θα ονόμαζα την doTheJod ως setAreaAndPerimeter (συν ότι θα έβαζα το this για τα attributes από το να τα αφήσω σκέτα, για καλύτερη ανάγνωση και μόνο) Με κλήση στον κατασκευαστή είναι λάθος λογική και λάθος εν γένει.
pbp Δημοσ. 20 Οκτωβρίου 2011 Μέλος Δημοσ. 20 Οκτωβρίου 2011 Συνεπώς, τον κατασκευαστή μιας κλάσης δεν μπορούμε να τον καλέσουμε στην ίδια την κλάση. Σας ευχαριστώ πολύ παιδιά! Να στε καλά
moukoublen Δημοσ. 20 Οκτωβρίου 2011 Δημοσ. 20 Οκτωβρίου 2011 Αν και συνολικά θα σου πρότεινα κάτι άλλο. Να μην κρατάς σε επιπλέον μεταβλητή στοιχεία τα οποία προκύπτουν από άλλα στοιχεία που ήδη έχεις. Και εννοώ: > public class Rectangular2ndWay { private int width; private int length; public Rectangular2ndWay(int width, int length) { this.setWidth(width); this.setLength(length); } public int getWidth() { return width; } public int getLength() { return length; } public void setWidth(int width) { this.width = width; } public void setLength(int length) { this.length = length; } public int getEmv() { return length*width; } public int getPerimeter() { return (length+width)*2; } }
Timonkaipumpa Δημοσ. 20 Οκτωβρίου 2011 Δημοσ. 20 Οκτωβρίου 2011 Συνεπώς, τον κατασκευαστή μιας κλάσης δεν μπορούμε να τον καλέσουμε στην ίδια την κλάση. Σας ευχαριστώ πολύ παιδιά! Να στε καλά Μπορούμε!!!!!! Φυσικά και μπορούμε! Π.χ. > public class Foo { private Foo() { //Do anything to instantiate } public static Foo getFooInstance() { Foo a = new Foo(); return a; } }
pbp Δημοσ. 20 Οκτωβρίου 2011 Μέλος Δημοσ. 20 Οκτωβρίου 2011 Μπορούμε!!!!!! Φυσικά και μπορούμε! Π.χ. > public class Foo { private Foo() { //Do anything to instantiate } public static Foo getFooInstance() { Foo a = new Foo(); return a; } } Μπορείς να χρησιμοποιήσεις κάπως αυτόν τον τρόπο στο παράδειγμα που έδωσα ?
Timonkaipumpa Δημοσ. 20 Οκτωβρίου 2011 Δημοσ. 20 Οκτωβρίου 2011 Μπορείς να χρησιμοποιήσεις κάπως αυτόν τον τρόπο στο παράδειγμα που έδωσα ? Μπορείς, αλλά είναι εντελώς λάθος συλλογιστικά. Φυσικά και μπορείς. Ό,τι θες μπορείς να κάνεις.. software είναι. Αλλά, κατά την γνώμη μου, ο πιο ορθός τρόπος είναι ό,τι έχει πει ο moukoublen (ελπίζω να έγραψα σωστά το nick). Και νέα κλάση μπορείς να κάνεις derive και να την κάνει να έχει μέσα τις άλλες κλάσεις, να κάνει implement interfaces και και και.. Αλλά.. για αυτό που έγραψες ό,τι έχει γραφτεί εδώ είναι παραπάνω από ΟΚ. Το παράδειγμα που έγραψα ήταν απλά γιατί αυτό που έγραψες ήταν λάθος (ότι δεν μπορούμε να καλέσουμε τον κατασκευαστή μίας κλάσης μέσα στην ίδια την κλάση). Επίσης, επειδή έχω την αίσθηση ότι ακόμα δεν έχεις γράψει τι ακριβώς θέλεις, πιστεύω ότι δεν πρόκειται κάποιος να σε βοηθήσει όσο θα ήθελε εάν δεν πεις τι ακριβώς θες να κάνεις.
nilosgr Δημοσ. 20 Οκτωβρίου 2011 Δημοσ. 20 Οκτωβρίου 2011 Μα δεν έχω κληρονομικότητα εδώ. Έστω ας πούμε οτι έχω: > class A { int temp public A(int temp) { this.temp=temp; } public void method(int temp) { //εδώ θέλω να καλέσω τον κατασκευαστή Α. } } Sorry, δεν καταλαβα καλα την ερωτηση... Τοτε κανε κατι τετοιο ισως... >public void Func(Object o) { this = new MyClass(o); }
Timonkaipumpa Δημοσ. 20 Οκτωβρίου 2011 Δημοσ. 20 Οκτωβρίου 2011 Sorry, δεν καταλαβα καλα την ερωτηση... Τοτε κανε κατι τετοιο ισως... >public void Func(Object o) { this = new MyClass(o); } Και εάν o είναι ένας int; Ή ένας array; (στις απλές των περιπτώσεων) Δεν νομίζω ότι είναι καλή λύση αυτή που προτείνεις...
Προτεινόμενες αναρτήσεις