Classe Abstrata ou Interface

Eu acho meio hipócrita do Gosling ou qualquer outro envolvido com a criação de Java falar mal de herança. O grande problema é que Java não oferece nenhum mecanismo para reuso de código comparável a herança. Se houvessem mixins ao menos…

Não dá para dizer. Sem conhecer o domínio e a implementação qualquer exemplo é falho. O que é uma Transação neste contexto? Eu já trabalhei para alguns bancos e cada um tem um conceito diferente, mesmo várias definições dentro da mesma instituição.

Eu não sou xiita quanto a isso simplesmente porque já vi muita besteira sendo feita em nome de “herança é ruim, use composição”. Isso é uma rule of thumb e não uma lei. Como falei antes o design de Java faz com que seja muito difícil resolvermos problemas comuns sem heranças ou gambiarras (strategy de uma implementação só e o fim).

Para mim, a decisão entre delegação e herança passa pelo domínio e este é o principal juiz. Esta delegação faz sentido no domínio? Eu dificilmente criaria uma classe extra na Camada de Negócios só para satisfazer uma rule of thumb.

Ps: Tarso, dar up é muito feio.

Desculpe :oops: … Você acreditaria se eu dissesse que pensei mil vezes antes de fazer isso? Fiz porque a rotatividade do Java Básico é muito alta, e também porque não encontrei outra opção de torná-lo visível novamente.

Entendo. Aparentemente trata-se de uma transação financeira e não bancária. O contexto no qual o exemplo se encaixa é muito vago, não dá mais detalhes sobre o domínio.

Pois é… Eu estava falando justamente isso pra um amigo meu que leu sobre isso há pouquíssimo tempo, e ficou xiita quanto à herança. Quando algumas pessoas se deparam com esse "mantra" pela primeira vez, ficam tão impressionadas que passam a abominar totalmente seu uso. Isso ocorre porque elas vinham utilizando herança em todas as situações que requeriam apenas composição ( o caso Pessoa -> PessoaFisica é clássico ).

para implementações como nas classes de stream no pacote java.io, utilizando a concepção do pattern decorator.

um exemplo de composição a partir de interfaces você pode visualizar a partir deste modelo abaixo pelo padrão observer:

já para um modelo com classes abstratas, seria o mesmo padrão utilizando as classes no pacote java.util, como Observable. neste caso prefiro o 1º caso.

Outro exemplo é o padrão Strategy:

[code]interface Strategy {
void doStrategy();
}

class ConcreteStrategy1 {
void doStrategy() {
System.out.println(“Strategy 01”);
}
}

class ConcreteStrategy2 {
void doStrategy() {
System.out.println(“Strategy 02”);
}
}

class Client {
private Strategy strategy;

public void setStrategy(Strategy strategy) {
    this.strategy = strategy;
}

}[/code]