Eu estava lendo o item 24 deste livro e, em um dos últimos parágrafos, o autor comenta sobre o armazenamento de objetos de dados como um long primitivo. O texto é sobre como fazer cópias defensivas de objetos em seus construtores e métodos de acesso.
Então, em vez de usar
public void setDate(Date date) { this.date = date; }
você deve utilizar:
public void setDate(Date date) { this.date = new Date(date.getTime()); }
Isso é bastante óbvio, depois de anos desenvolvendo o software OO, e explicar isso está fora do alcance deste artigo. Agora, vamos falar sobre o uso de longs primitivos. Realmente parece ser uma ideia muito interessante. Desde que você tivesse que usar o valor long dos dados locais (privado) o tempo todo para criar as cópias defensivas, armazenando-o como um long primitivo, imediatamente nos levaria a um código mais limpo e legível.
O construtor simplesmente armazenaria o dado long, e o acessor seria tão simples quanto
public Date getDate() { return new Date(myDateAsLong); }
Além disso, seria mais fácil armazenar os dados no banco de dados, desde que não tenhamos que converter um objeto Date para um formato que o banco de dados entenda.
Agora, a grande questão: por que não pensei nisso antes?
***
Texto original disponível em http://jcranky.com/2009/02/10/store-date-attribute-as-primitive-longs/