O que ele diz (e não quer dizer que esteja absolutamente certo mas Joshua Bloch é uma referência cheia de crdibilidade) é que você deve utilizar interfaces quando disponíveis (e eu acrescento: quando fizerem sentido!). O exemplo dado é bem claro: em vez de usar ArrayList, use List mas para String use String mesmo.
Esse é exatamente o tipo de caso em que não se usa itnerfaces. Objetos de negócio só devem ser manipulados unicamente por interfaces se:
- Possuem diversas implementações
- Você está manipulando um conceito, não uma implementação. Ok, vamos a um exemplo simples sobre esse ponto.
(notem que sou ignorante em contabilidade, é apenas um exemplo ilustrativo)
Temos o conceito de MovimentacaoFinanceira no nosso sistema. O que é isso? É uma quantidade de capital que entrou ou saiu da empresa, algo que tem um valor total, uma data, se é entrada ou saída e está relacionado a uma pessoa (emrpesa ou pessoa mesmo). Isso é um conceito abstrato e vamos implementá-lo por uma interface:
interface MovimentacaoFinanceira {
BigDecimal getValorTotal();
Pessoa getPessoaRelacionada();
Date getData();
TipoMovimentação getTipo();
}
Na parte de vendas do sistema, temos a classe Venda que representa uma movimentação financeira. Neste caso é um capital entrando relacionado a um cliente.
class Venda implements MovimentacaoFinanceira {
//METODOS ESPECIFICOS DESTA CLASSE...
public BigDecimal getValorTotal(){
//some o preço de todos os itens vendidos e retorne
}
public Pessoa getPessoaRelacionada(){ return this.getCliente(); }
public Date getData(){return this.data;}
public TipoMovimentação getTipo(){return TipoMovimentação.ENTRADA;}
}
Agora, quando usamos a classe e quando usamos a interface?
Se você está alterando o sistema de vendas, você não tem tanto interesse no conceito de movimentação financeira. Use a classe.
Se você está fazendo o sistema que contabiliza as operações e cospe um relatório contábil, para consolidar tudo você não quer saber se é uma venda, uma devolução, pagamento da conta de luz ou se é despesa de viagem do programador que você mandou para o RioJavaSummit 2006, dia 6 de Maio, no Rio de Janeiro. O que te interessa é que no fim das contas todas estas operações são movimentações financeiras, então você trabalha com a interface.
E porque MovimentaçaoFinanceira é uma interface e não uma classe abstrata?
Porque ela representa um conceito apenas, não uma implementação. A linha entre ambas é sutil e não é toda linguagem que oferece interfaces e classes (em java eu creio que a existência de interfaces como coisas separadas só se deu porque não existe herança múltipla).
Utilize classes abstratas quando você tem uma implementação parcial de um conceito que deve ser extendida. Utilize interfaces quando você tem apenas uma especificação do conceito.