andbin
03-04-2007, 17:01
Premessa: una inner-class anonima all'interno di un metodo non può accedere alle variabili locali del metodo .... a meno che la variabile sia marcata final.
Su questo non ci piove. Volevo però capire bene cosa succede "dietro le quinte" per via del final.
Ho scritto un breve programma di esempio, del tutto inutile ....
public class Prova
{
public static void main (String[] args)
{
Prova p = new Prova ();
Object o = p.create ("Hello");
System.out.println (o);
}
public Object create (final String str)
{
return new Object () {
private String text = str;
public String toString () {
return "Anonymous, text=" + text;
}
};
}
}Poi con il tool 'jad' ho decompilato il file Prova.class e poi il file Prova$1.class. Ho ottenuto questo:
import java.io.PrintStream;
public class Prova
{
public Prova()
{
}
public static void main(String args[])
{
Prova prova = new Prova();
Object obj = prova.create("Hello");
System.out.println(obj);
}
public Object create(final String str)
{
return new Object() {
public String toString()
{
return (new StringBuilder()).append("Anonymous, text=").append(text).toString();
}
private String text;
final String val$str;
final Prova this$0;
{
this$0 = Prova.this;
str = s;
super();
text = str;
}
}
;
}
}
final class Prova$1
{
public String toString()
{
return (new StringBuilder()).append("Anonymous, text=").append(text).toString();
}
private String text;
final String val$str;
final Prova this$0;
Prova$1()
{
this$0 = final_prova;
val$str = String.this;
super();
text = val$str;
}
}Non ho ben capito le cose che ho segnato il rosso: da dove salta fuori quella variabile 's'?? E final_prova, String.this che cosa sono???
Su questo non ci piove. Volevo però capire bene cosa succede "dietro le quinte" per via del final.
Ho scritto un breve programma di esempio, del tutto inutile ....
public class Prova
{
public static void main (String[] args)
{
Prova p = new Prova ();
Object o = p.create ("Hello");
System.out.println (o);
}
public Object create (final String str)
{
return new Object () {
private String text = str;
public String toString () {
return "Anonymous, text=" + text;
}
};
}
}Poi con il tool 'jad' ho decompilato il file Prova.class e poi il file Prova$1.class. Ho ottenuto questo:
import java.io.PrintStream;
public class Prova
{
public Prova()
{
}
public static void main(String args[])
{
Prova prova = new Prova();
Object obj = prova.create("Hello");
System.out.println(obj);
}
public Object create(final String str)
{
return new Object() {
public String toString()
{
return (new StringBuilder()).append("Anonymous, text=").append(text).toString();
}
private String text;
final String val$str;
final Prova this$0;
{
this$0 = Prova.this;
str = s;
super();
text = str;
}
}
;
}
}
final class Prova$1
{
public String toString()
{
return (new StringBuilder()).append("Anonymous, text=").append(text).toString();
}
private String text;
final String val$str;
final Prova this$0;
Prova$1()
{
this$0 = final_prova;
val$str = String.this;
super();
text = val$str;
}
}Non ho ben capito le cose che ho segnato il rosso: da dove salta fuori quella variabile 's'?? E final_prova, String.this che cosa sono???