java:this_operator

Ο τελεστής this

Πρόσβαση σε πεδία και μεθόδους των αντικειμένων της κλάσης μέσω του τελεστή this

Ας ξαναγράψουμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα, ως εξής

public class Rectangle {
 
  private int width;
  private int height;
  private Point origin;
 
  // the Rectangle class has one constructor
  public Rectangle(int width, int height, Point origin) {
    width = width;
    height = height;
    origin = origin;
  }
  ...
}

Στον παραπάνω κώδικα οι τοπικές παράμετροι του κατασκευαστή συμπίπτουν με τα ονόματα των μεταβλητών της κλάσης. Σε αυτή την περίπτωση η τοπική μεταβλητή ή παράμετρος “κρύβει” (shadows) την μεταβλητή του αντικειμένου της κλάσης. Προκειμένου να έχουμε πρόσβαση στην μεταβλητή του αντικειμένου της κλάσης θα πρέπει να χρησιμοποιήσουμε τον τελεστή this, ως εξής:

public class Rectangle {
 
  private int width;
  private int height;
  private Point origin;
 
  // the Rectangle class has one constructor
  public Rectangle(int width, int height, Point origin) {
    this.width = width;
    this.height = height;
    this.origin = origin;
  }
  ...
}

O τελεστής this υποδεικνύει το τρέχον αντικείμενο. Με τον παραπάνω τρόπο μπορούμε να διακρίνουμε μία μεταβλητής του τρέχοντος αντικειμένου (της μορφής this.variable) από μία τοπική μεταβλητή (variable) με το ίδιο όνομα.

Πρόσβαση στους κατασκευαστές της κλάσης μέσω του τελεστή this

Ας ξαναδούμε το παρακάτω τμήμα κώδικα το οποίο συναντήσαμε προηγούμενα θέλοντας να επιχειρήσουμε να επαναχρησιμοποιήσουμε τμήματα κώδικα ενός κατασκευαστή από έναν άλλο κατασκευαστή.

public class Rectangle {
 
  private int width;
  private int height;
  private Point origin;
 
  public Rectangle(int initWidth, int initHeight, Point initOrigin) {
    width = initWidth;
    height = initHeight;
    origin = initOrigin;
  }
 
  public Rectangle(int initWidth, int initHeight, int xPos, int yPos) {
    width = initWidth;
    height = initHeight;
    origin = new Point(xPos,yPos);
  }
  ....
}

Ιδανικά θα θέλαμε να καλέσουμε έναν κατασκευαστή μέσα από έναν άλλο κατασκευαστή. Στη Java αυτό είναι εφικτό με χρήση του τελεστή this, ως εξής:

public class Rectangle {
 
  private int width;
  private int height;
  private Point origin;
 
  public Rectangle(int initWidth, int initHeight, Point initOrigin) {
    width = initWidth;
    height = initHeight;
    origin = initOrigin;
  }
 
  public Rectangle(int initWidth, int initHeight, int xPos, int yPos) {
    this(initWidth, initHeight, new Point(xPos,yPos));
  }
  ....
}

Το παραπάνω, είναι αποδεκτό από τον compiler της Java. Ο τελεστής this χρησιμοποιείται για να κληθεί από ένα κατασκευαστή ένας άλλος κατασκευαστής της ίδιας κλάσης.

Η κλήση ενός κατασκευαστή μέσα από άλλο κατασκευαστή θα πρέπει να γίνει στην αρχή του σώματος του κατασκευαστή. Αν δεν το κάνετε και προηγηθεί μία άλλη εντολή πριν την κλήση του κατασκευαστή θα λάβετε ένα μήνυμα λάθους από τον compiler. Ενδεικτικό είναι το παρακάτω παράδειγμα:

public class Rectangle {
 
  private int width;
  private int height;
  private Point origin;
 
  public Rectangle(int width, int height, Point origin) {
    this.origin = origin; 
    this(width, height);
 
  }
 
  public Rectangle(int width, int height) {
    this.width = width;
    this.height = height;
  }
  ....
}

Συμπερασματικά

O τελεστής this δείχνει στο τρέχον αντικείμενο της εκάστοτε κλάσης, για λογαριασμό του οποίου εκτελείται. Μπορείτε να τον χρησιμοποιείτε τόσο για να προσπελάσετε τα πεδία του αντικειμένου ή να καλέσετε τον κατασκευαστή της κλάσης για το τρέχον αντικείμενο. Με χρήση του τελεστή this μπορείτε επίσης να καλέσετε και μεθόδους της κλάσης από το τρέχον αντικείμενο, πράγμα που όμως δεν θα το δείτε, καθώς στην πράξη δεν υπάρχει ανάγκη για κάτι τέτοιο.

Μπορείτε να δείτε την κλάση Rectangle, όπως διαμορφώνεται με χρήση του τελεστή this τόσο για την κλήση ενός κατασκευαστή της κλάσης από άλλο, όσο για την πρόσβαση στα πεδία της κλάσης όταν αυτά επισκιάζονται από τοπικές μεταβλητές ή παραμέτρους μεθόδων με το ίδιο όνομα εδώ.

java/this_operator.txt · Last modified: 2017/02/16 11:24 by gthanos