Java, non-static member class

Una non-static member class è una inner class definita senza la keyword static (vedere il punto (2) dell’esempio sotto).
Bisogna osservare che:

  • Un’istanza di una non-static member class può esistere solo e soltanto insieme all’istanza della classe che la contiene
  • Una non-static member class non può avere static members (a meno che non siano anche final)
  • Il codice scritto in una non-static member class può avere accesso diretto a ogni membro (inclusi i nested) anche se dichiarato private

Vediamo un esempio con un po’ di casi particolari.

public class MyLinkedList {
private String message = "Shine the light"; // (1)

public Node makeInstance (String info, Node next) {
return new Node(info, next);
}

public class Node { // (2) non-static member class (NSMC)
final static int maxNumOfNodes = 100;
private String nodeInfo;
private Node next;
private String message ="Messaggio dal Nodo "; // (3)

public Node(String nodeInfo, Node next) {
this.nodeInfo = nodeInfo;
this.next = next;
}

@Override
public String toString(){
message = "Modifica del message di Node"; // (4)
return MyLinkedList.this.message + " in " + nodeInfo + " (" + maxNumOfNodes + ")"; // (5)
}
}
}

public class ListClient {
public static void main(String[] args) {
MyLinkedList list = new MyLinkedList();
MyLinkedList.Node node1 = list.makeInstance("node1", null);
MyLinkedList.Node node2 = list.makeInstance("node2", node1);
System.out.println(node2.toString());
}
}

Osserviamo il punto (4).
Viene modificato il valore asseganto all’attributo di tipo stringa message. Ma esistono 2 attributi di tipo stringa denominati message! Li vediamo dichiarati al punto (1) e al punto (3), entrambi private. Il message al punto (1) appartiene alla classe contenitore (MyLinkedList), mentre quello dichiarato al punto (4) appartiene alla non-static inner class (Node). Abbiamo detto che in una non-static member class possiamo riferirci a qualunque membro, anche dichiarato private, anche appartenente alla classe contenitore. Ma come possiamo riferisci all’attributo message del contenitore? Lo si può fare con un uso particolare della parole chiave this. Osserviamo a tal riguardo il punto (5).

ATTENZIONE.
Se non fosse stato dichiarato l’attributo al punto (4), allora scrivendo

return message + " in " + nodeInfo + " (" + maxNumOfNodes + ")"; // (5a)

non si avrebbe alcun errore (come invece ci si potrebbe aspettare), poiché ci riferiremmo, in modo implicito, all’attributo message della classe contenitore!!!
Facciamo attenzione a questo caso particolare!

Hai letto questi articoli?