Normalmente, quando trabalhamos com objetos imutáveis, nós temos mais seguranças. Por exemplo, em java:
public static void main(String[] args) {
Calendar today = Calendar.getInstance(); // 14/12/2014
Calendar tomorrow = getTomorrow(today); // 15/12/2014
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
System.out.println("Today: " + formatter.format(today.getTime()));
System.out.println("Tomorrow: " + formatter.format(tomorrow.getTime()));
}
public static Calendar getTomorrow(Calendar today) {
Calendar tomorrow = today;
tomorrow.add(Calendar.DAY_OF_MONTH, 1);
return tomorrow;
}
Só que esse código tem um problema, ao invés de sair:
Today: 14/12/2014
Tomorrow: 15/12/2014
Ele imprime:
Today: 15/12/2014
Tomorrow: 15/12/2014
E isso é um problema terrível. Imagine, você tem uma entidade do Java e, no meio de uma transação do Hibernate, decide calcular uma data (com Calendar) através de um atributo dessa entidade, se você não tiver o conhecimento e cuidado prévio, o Hibernate vai mudar o valor da data no banco de dados.
Se os autores do Calendar tivessem projetado essa classe para ser imutável, nós sempre estaríamos protegidos desses problemas.
A classe String, por exemplo, é imutável e ficamos livres desses problemas:
String a = "Rafael";
String b = a;
b = b.toUpperCase();
System.out.println(a); // Rafael
System.out.println(b); // RAFAEL
Portanto, deixe seu código menos suscetível a erros silenciosos como esse, prefira o let
ao var
.
PS: para "resolver" o problema do Calendar, você pode fazer assim: Calendar tomorrow = (Calendar) today.clone();
Só que ficar fazendo isso não é nem um pouco legal.
PPS: É melhor, mesmo, usar o joda time ou a nova API de data do Java 8. Que são imutáveis :)