Tradimenti di Java
Il codice incriminato:
public class Test {
public static void main(String[] args) {
String a1 = "test";
String a2 = "test";
System.out.println(a1 == a2);
a2 = new String("test");
System.out.println(a1 == a2);
}
}
Il primo confronto ritorna true, mentre il secondo false: ora, io avevo sempre pensato che una stringa inizializzata nel primo modo fosse semplicemente una scorciatoia al posto di new, invece a quanto pare sono due cose profondamente diverse. Il primo confronto dovrebbe, a norma di legge, confrontare i riferimenti, non i contenuti, ed invece non è così (nonostante i due oggetti siano dichiarati separatamente).
Perchè l’ho chiamato tradimento? Bè, perchè questo viola chiaramente il presupposto degli oggetti in Java: per quanto le stringhe siano un tipo base, sono comunque oggetti a tutti gli effetti, o almeno lo erano prima di questa scoperta… inutile dire che vale lo stesso fattaccio anche per gli oggetti che incorporano i tipi base (Integer vs. int). Questo dimostra comunque che conviene usare equals, dato che se una stringa viene ricreata l’== non funziona più, ma resta un notevole pacco.
Un ringraziamento a Maintux, che ha insinuato il seme del dubbio, ed a Sante che ha condiviso un’istanza di Eclipse all’uopo.
Tags: informatica, Java
Pdf version
3 comments so far
Leave a reply