Προς το περιεχόμενο

Java: Κλήση κατασκευαστή μέσα στην ίδια του την κλάση.


pbp

Προτεινόμενες αναρτήσεις

>super(); //ή με τα ορισματα που θες

 

Μα δεν έχω κληρονομικότητα εδώ.

Έστω ας πούμε οτι έχω:

>
class A
{
   int temp
   public A(int temp)
  {
     this.temp=temp;
  }
   public void method(int temp)
   {
     //εδώ θέλω να καλέσω τον κατασκευαστή Α.
   }
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλησπέρα,

 

Ο 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 κώδικα, ελπίζω να τα θυμάμαι καλα! :P

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γεια σας,

Μήπως μπορείτε να μου πείτε πως μπορώ να καλέσω τον κατασκευαστή μιας κλάσης μέσα στην ίδια του την κλάση, μέσω μιας μεθόδου?

 

 

Τι ακριβώς θες να κάνεις;

 

 

Όπως έχεις ορίσει την "method", το νέο instance απλά θα δημιουργείται και θα μένει εκεί. Μόλις βγεις από την μέθοδο θα χάνεται (θα μαζεύεται από τον garbage collector την επόμενη φορά που θα κλιθεί από την VM). Εάν θες να ελέγχεις την δημιουργία ενός instance, τότε θα πρέπει να έχεις ως private τον constructor και να τον καλείς από μία άλλη μέθοδο η οποία θα επιστρέφει ένα instance τύπου της κλάσης.

 

Πες τι ακριβώς θες να κάνεις να βρεθεί η λύση.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τι ακριβώς θες να κάνεις;

 

 

Όπως έχεις ορίσει την "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());
   }
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κάτι τέτοιο;

>
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;
   }
}

Κάτι τέτοιο;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ακριβώς ό,τι έγραψε ο moukoublen. Μόνο που θα ονόμαζα την doTheJod ως setAreaAndPerimeter (συν ότι θα έβαζα το this για τα attributes από το να τα αφήσω σκέτα, για καλύτερη ανάγνωση και μόνο) :P

 

Με κλήση στον κατασκευαστή είναι λάθος λογική και λάθος εν γένει.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν και συνολικά θα σου πρότεινα κάτι άλλο.

 

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

 

Και εννοώ:

 

>
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;
   }
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Συνεπώς, τον κατασκευαστή μιας κλάσης δεν μπορούμε να τον καλέσουμε στην ίδια την κλάση.

Σας ευχαριστώ πολύ παιδιά!

Να στε καλά :)

 

 

Μπορούμε!!!!!!

 

Φυσικά και μπορούμε!

 

 

Π.χ.

 

>

public class Foo
{

 private Foo()
 {
   //Do anything to instantiate 
 }

 public static Foo getFooInstance()
 {
   Foo a = new Foo();
   return a;
 }
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπορούμε!!!!!!

 

Φυσικά και μπορούμε!

 

 

Π.χ.

 

>

public class Foo
{

 private Foo()
 {
   //Do anything to instantiate 
 }

 public static Foo getFooInstance()
 {
   Foo a = new Foo();
   return a;
 }
}

Μπορείς να χρησιμοποιήσεις κάπως αυτόν τον τρόπο στο παράδειγμα που έδωσα ?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπορείς να χρησιμοποιήσεις κάπως αυτόν τον τρόπο στο παράδειγμα που έδωσα ?

 

 

Μπορείς, αλλά είναι εντελώς λάθος συλλογιστικά. Φυσικά και μπορείς. Ό,τι θες μπορείς να κάνεις.. software είναι. :P

 

Αλλά, κατά την γνώμη μου, ο πιο ορθός τρόπος είναι ό,τι έχει πει ο moukoublen (ελπίζω να έγραψα σωστά το nick).

 

Και νέα κλάση μπορείς να κάνεις derive και να την κάνει να έχει μέσα τις άλλες κλάσεις, να κάνει implement interfaces και και και..

 

Αλλά.. για αυτό που έγραψες ό,τι έχει γραφτεί εδώ είναι παραπάνω από ΟΚ.

 

 

Το παράδειγμα που έγραψα ήταν απλά γιατί αυτό που έγραψες ήταν λάθος (ότι δεν μπορούμε να καλέσουμε τον κατασκευαστή μίας κλάσης μέσα στην ίδια την κλάση).

 

Επίσης, επειδή έχω την αίσθηση ότι ακόμα δεν έχεις γράψει τι ακριβώς θέλεις, πιστεύω ότι δεν πρόκειται κάποιος να σε βοηθήσει όσο θα ήθελε εάν δεν πεις τι ακριβώς θες να κάνεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μα δεν έχω κληρονομικότητα εδώ.

Έστω ας πούμε οτι έχω:

>
class A
{
   int temp
   public A(int temp)
  {
     this.temp=temp;
  }
   public void method(int temp)
   {
     //εδώ θέλω να καλέσω τον κατασκευαστή Α.
   }
}

 

Sorry, δεν καταλαβα καλα την ερωτηση... :rolleyes:

Τοτε κανε κατι τετοιο ισως...

>public void Func(Object o)
{
   this = new MyClass(o);
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Sorry, δεν καταλαβα καλα την ερωτηση... :rolleyes:

Τοτε κανε κατι τετοιο ισως...

>public void Func(Object o)
{
   this = new MyClass(o);
}

 

Και εάν o είναι ένας int; Ή ένας array; (στις απλές των περιπτώσεων)

 

 

 

Δεν νομίζω ότι είναι καλή λύση αυτή που προτείνεις...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.
  • Δημιουργία νέου...