sabato 1 maggio 2010

Java: la classe Object

Java è un linguaggio di programmazione orientato agli oggetti. Ogni classe permette l'istanza di nuovi oggetti (se la classe non è astratta) e l'invocazione dei metodi (pubblici) sugli stessi.
L'astrazione degli oggetti è resa possibile grazie alla classe Object, dalla quale discendono di default tutte le classi che si scrivono in Java (pur non scrivendo per esteso ogni volta class MyNewClase extends Object). In Object vengono implementati diversi metodi che, per il meccanismo dell'ereditarietà usato da Java, sono allora disponibili anche presso le sottoclassi.
Alcuni di questi metodi coinvolgono essenzialmente gli oggetti della classe, come ad esempio i metodi: clone(), toString() ed equals(). Altri invece entrano in gioco quando si fa uso di thread (per la programmazione multiprocesso o multithread), come ad esempio: wait(), notify() e notifyAll(). Ci occuperemo in futuro di questi metodi.
Il codice scritto in questi metodi è generico e spesse volte occorre riscrivere i metodi ereditati affinché il risultato ritornato sia effettivamente corretto.
Il metodo equals() (con firma public boolean equals(Object obj) ritorna un valore booleano che simboleggia l'esito del confronto fra i due oggetti. Le istruzioni collocate di default in equals() verificano l'eventualità che i due oggetti coinvolti nel confronto puntino alla stessa area di memoria. Si tratta quindi di un confronto poco significativo dal momento che possono esistere due oggetti uguali ma residenti in distinte aree di memoria! Occorre allora ridefinire il metodo in ogni classe (se questo serve) fornendo al suo interno altre istruzioni, ad esempio quelle che coinvolgono il confronto di tutti i campi delle istanze.
Il metodo toString() (con firma public String toString()), invece, ritorna una stringa che descrive l'oggetto. Si consiglia di riscrivere questo metodo in ogni classe implementata poiché risulta particolarmente utile in fase di debugging (far stampare a toString() i campi dell'istanza può sempre essere utile) Il metodo println(x), dunque, equivale a chiamare sull'oggetto x il metodo toString(). In altre parole è possibile riscrivere la chiamata a println(x) come println(x.toString()).
Il metodo clone() (con firma protected Object clone()), infine, esegue la copia di un oggetto allocandone uno nuovo e ricopiando in quest'ultimo gli stessi valori dell'istanza campione. Attenzione, il metodo clone() non copia gli oggetti contenuti nell'oggetto da clonare ma si limita a riportare il riferimento per ognuno di questi (per realizzare una copia fedele di un oggetto e degli oggetti in esso contenuti bisogna evidentemente duplicare anche gli altri oggetti).
La classe Object, inoltre, può essere adoperata come contenitore generico di oggetti (essendo la classe padre di tutti gli oggetti Java). Non dimenticate di ripristinare, il tipo dell'oggetto con un operazione di casting!

/* viste da dietro le carte possono sembrare tutte uguali */
class Card {
   public Card(String typeGame, int edition) {
      this.typeGame = typeGame;
      this.edition = edition;
   }
   public String getTypeGame() {
      return typeGame;
   }
   public int getEdition() {
      return edition;
   }
   public boolean equals(Card anotherCard) {
      if ((this.typeGame.compareTo(anotherCard.getTypeGame())) == 0) {
         if (this.edition == anotherCard.getEdition())
            return true;
         else
            return false;
      } else return false;
   }
   public String toString() {
      String description= "Una carta " + this.getTypeGame()
      + " dell'edizione numero " + this.getEdition() + ".";
      return description;
   }
   private String typeGame;
   private int edition;
}

Nessun commento:

Posta un commento