il_luridone
17-06-2006, 22:30
Salve a tutti,
ho un pezzo di codice di esempio che non riesco a comprendere perchè fa cose che non credevo possibili con Java.
Il fatto è questo: ho una classe statica BindingManager che ha un metodo statico create() che ritorna un new BindingManager(). Già qui è strano perchè così capisco che sta istanziando una classe statica e qualcosa non mi torna... ma soprattutto il new ha una forma che non avevo mai visto: new BindingManager() { /*... metodi ...*/ };
La parte di codice oscura è quella tra i commenti // ?!?, il resto l'ho postato solo per contesto.
Qualcuno saprebbe dirmi cosa significa o almeno indicarmi un riferimento per cercare sul Java Language Specification?
public static class BindingManager {
public static BindingManager create() {
return new BindingManager() { // ?!?
public void exitScope() {
throw new IllegalStateException("exitScope from top level");
}
public boolean contains(String identifier) {
return map.containsKey(identifier);
}
public Literal getValue(String identifier) {
return (Literal) map.get(identifier);
}
}; // ?!?
}
private BindingManager enclosingScope;
protected Map map = new HashMap();
private BindingManager() {
}
private BindingManager(BindingManager enclosingScope, Map map) {
this.enclosingScope = enclosingScope;
this.map = map;
}
public void enterScope() {
this.enclosingScope = new BindingManager(enclosingScope, map);
this.map = new HashMap();
}
public void exitScope() {
this.enclosingScope = enclosingScope.enclosingScope;
this.map = enclosingScope.map;
}
public boolean contains(String identifier) {
return map.containsKey(identifier) ? true : enclosingScope.contains(identifier);
}
public void bind(String identifier, Literal value) {
map.put(identifier, value);
}
public Literal getValue(String identifier) {
Literal value = (Literal) map.get(identifier);
return (value != null) ? value : enclosingScope.getValue(identifier);
}
}
ho un pezzo di codice di esempio che non riesco a comprendere perchè fa cose che non credevo possibili con Java.
Il fatto è questo: ho una classe statica BindingManager che ha un metodo statico create() che ritorna un new BindingManager(). Già qui è strano perchè così capisco che sta istanziando una classe statica e qualcosa non mi torna... ma soprattutto il new ha una forma che non avevo mai visto: new BindingManager() { /*... metodi ...*/ };
La parte di codice oscura è quella tra i commenti // ?!?, il resto l'ho postato solo per contesto.
Qualcuno saprebbe dirmi cosa significa o almeno indicarmi un riferimento per cercare sul Java Language Specification?
public static class BindingManager {
public static BindingManager create() {
return new BindingManager() { // ?!?
public void exitScope() {
throw new IllegalStateException("exitScope from top level");
}
public boolean contains(String identifier) {
return map.containsKey(identifier);
}
public Literal getValue(String identifier) {
return (Literal) map.get(identifier);
}
}; // ?!?
}
private BindingManager enclosingScope;
protected Map map = new HashMap();
private BindingManager() {
}
private BindingManager(BindingManager enclosingScope, Map map) {
this.enclosingScope = enclosingScope;
this.map = map;
}
public void enterScope() {
this.enclosingScope = new BindingManager(enclosingScope, map);
this.map = new HashMap();
}
public void exitScope() {
this.enclosingScope = enclosingScope.enclosingScope;
this.map = enclosingScope.map;
}
public boolean contains(String identifier) {
return map.containsKey(identifier) ? true : enclosingScope.contains(identifier);
}
public void bind(String identifier, Literal value) {
map.put(identifier, value);
}
public Literal getValue(String identifier) {
Literal value = (Literal) map.get(identifier);
return (value != null) ? value : enclosingScope.getValue(identifier);
}
}