135 á 154

Contudo o capitulo fala de algumas práticas relacionadas á refinação de ambiente, automação de execução de deploy entrega continua e discute desafios e considerações arquiteturas .

Tendo automação de ambiente de desenvolvimento, um processo que ajuda quando as equipes possuem alta rotatividade de desenvolvedores.

A automação do deploy ,permitindo sua execução em poucos minutos com um único clique facilitando a entrega rápida de correções e funcionalidades.T

ambém ressalta que a automação traz benefícios mas impões custos á equipe de infraestrura e operações ,que precisa lidar com problemas frequentes.

Entretanto são destacada dois desafios relacionados á escalabilidade de aplicação:aumento proporcional da quantidade de entidades manipuladas por alguns framework,o tamanho da informações transnitida(payload).Surgem os Data Tranfer Objects (DTO)para atimizar o serviço.

Além disso são mencionadas práticas para otimização da comunicação ,como minimizar chamadas ,usar caches e compáctar arquivos trafegados.

As decisões arquiteturais são discutidas em relação a frameworks que envolvem trabalho em mais de um tier.

Tendo falando sobre o evolução de frameworks java para desenvolvimento web ,começando Servles em 1997 e JSP em 1998.

105 á134

Entretanto ao desenvolver torna responsável por código de infraestrutura que trabalho com Sockets, protocolos e exceptions .

O protocolo tratar corretamente as exceptions no caso de o servidor cair timeouts e outros detalhes são problemas de infraestrutura que leva bastante tempo para se resolver corretamente.

Tendo assim fácil mostrar o código ingenuo.A remotabilidade é uma dos aspectos que podem aparecer uma aplicação e desejase gastar o menor tempo gastar o menor tempo possivel.

O código do controlador é invocado internamente pela proxy .Pois encontrar diversos frameworks como o RMI e o Hibernate.

Contudo tendo várias práticas relacionadas ao desenvolvimento de software,incluindo Test Driven Development (TDD),Acceptance Test-Driven Development (ATDD) testes de integração ,feedback rápido ,integração contínua e entrega contínua.

Pois que o ATDD sugere criar testes de sistema antes da implementação para garantir um entendimento comum entre a equipe.

Visto que TDD,destaca-se a importância de escrever testes de unidade antes da implementação,garantindo que o código seja fácil de testar e por tanto ,provavelmente bem projetado .

Uma vez que o feedback rápido é crucial no desenvolvimento de software para identificar rapidamente falhas ou a necessidade de ajustes.

95 á 104

Entanto a solução seria usar fabricas específicas para componente,mas isso aumenta ainda mais as responsabilidades da nossa classe além de agora gerar acoplamento com várias outras classes de fábrica.

Tendo a ideia é diminuir o problema do acoplamento com diversas fábricas diferentes,e de se conhecer pontos de acesso global distintos para cada dependência.

Visto que o service locator é prover um único método que recebe como argumento qual componente se deseja obter .

DI singleton é um dos design patterns com pior firma.Em 2009 durante uma entrevista em comemoração ao 15 anos do livro Design Patterns, ao ser peguntado sobre quais mudanças faria no livro em uma hipotética revisão,Erich Gamma-afirmou que tiraria Singleton dele .

O autor ainda afirmou que singletons seriam um design smell.

9º 85 á 94

Estas paginas os autores falam de alguns aplicativos como Web ,EJB do Java EE.

O mesmo diz que quando estes aplicativos invocam métodos de uma Servelt ou os callback de um EJB.

DI é uma das formas de implementar -lo ,mas não a única .O aplicativo Web usar o DAO.

A usar a Connection Factory alivia um poucos do problema ,mas não é uma boa solução.

A responsabilidades normais ligadas a Web ,como o manipular request e response ,agora também com está acoplada a Connection, connection Factorye DAO.

O segredo de DI é pensar em cada componente isoladamente,de uma maneiro quase egoísta com relação ao restante do sistema .

Um dos principais ,em importância e em uso é o Spring Framework,idealizada por Rod Johnson.

65 á 74

Esse tipo de classe tem uma caracteristíca bem procedural ,fortemente sinalizada pela ausência de atributos e excesso de uso de métodos como funções (deposita e saca poderiam ser estáticos).

Entretanto o tópicos de orientação a objetos unir a lógica de negócio aos dados de uma maneira simples.

O Senhor Alan Kay criou o termo “programação orientada a objeto”,diz que foi uma má ideia ,contudo diminui a ênfase da ideia importante ,a troca de mensagem .

A necessidade de um método setld para chave primária torna-se discutível no memento em que um framework utiliza reflection ou manipulação de bytecode para ler atributos privados.

Considere Domain -Driven Design todo software é desenvolvido com próposito concreto,resolver problemas reais que acontecem com pessoas reais.

Domain-Driven Design (DDD)é guiar o processo de design da sua aplicação pelo domínio.

Mas muitos softwares não são projetados de acordo com o domínio em que atuam.

Segundo o DDD é impossível resolver o problema no domínio do cliente sem entendê -lo profundamente.

O Domain Model (modelo do domínio) é uma abstração do problema real ,que envolve aspectos do domínio que devem ser expressados no sistema ,desenvolvida em parceria pelas especialistas do domínio e desenvolvedores.

A principal literatura sobre Domain -Driven Design é o livro homônimo de Senhor Eric Evans.

75 á 84

Pode-se talar do acoplamento entre duas classes , ou do quanto dois modulos da aplicação estão amarrados ,ou avaliar o quanto dois trameworks distintos são atetados um pelo outro .

Visto que o acoplamento implica na facilitação da troca dos mesmo ,alem de ser peça fundamental para a manutenção do código ,tormando um arquitetura de maior qualidade.

Segundo o Senhor Bor Martim diz que os designs deterioram á medida que novo requisitos torçam mudanças que não toram previstas ,e isso taz com que sejam introduzidas dependências novas e não planejadas entre classes e modulos do sistema.

Enquanto que Senhor Fowler tem uma opinião parecida e diz que ,á medida que os sistemas crescem é necessário uma maior atenção ao seu gerenciamento dessas dependências ,pois caso contrário simples alterações podem ser propagadas para outras classes ou modulos ,prejucando assim ser propagadas assim a evolução do software .

Há quem diga que o termo apareceu pela primeira vez em 1974 ,mas palavras de Edsger Dijkstra,quando argumentava que ao desenvolver um software ,muitos aspectos diferentes devem ser tratados.

No mundo web , arquivos HTML preocupam-se em descrever conteúdo , arquivos CSS descrevem a apresentação e por tim ,arquivo Java Script ,a lógica da sua página.

5º 45á 54

Após analisar a fundo as implementações das atuais Session e EntiyManager do Hibemate viram que não retornar ArrayList nem LinkedList,nem nenhuma coleção do java util,estas implementações faz parte do seu próprio pacote.

Nas principais APIs do java é fundamental programa voltado á interface.

Caso não utilizar esses método dever receber uma referencia a inputStream sendo mais flexivel.

A vantagem de utiliza código de interface é que está sempre desacoplado de qualquer outro que as utilize.

Desta forma ,fica muito fácil trocar a implementação sem modificar todo o código,o mesmo ocorre devido interfaces.

O uso exagerado de reflection para invocar métodos depende de algumas condições que pode ser substituído por interfaces.

Este método invocado é o polimorfismo ,diminuindo a complexidade e aumentando a manutenibilidade ,além ganho de performance.Sendo possível extrair algum método da classe distintas como Retemlmposto, processa Estoque ,transferencia e confirmação.

A API serclets usar um design baseado em interfaces com um strategy pattern,evitando a herança.A ao substituir a herança por interface ,continuamos com o benefício do polimorfismo .

.O Joshua Bloch ,no effective Java, fala de Design for jnheritance com diversas pratica como evitar invocações entre métodos público, para que a sobescrita de um não mude o comportamento de outro.

6º 55á 64

Com a interface e composição foi possível criar um novo driver JDBC para determinar banco de dados ou facilitar trabalho ,com implementando diferentes critérios de comparação.

Este principio de manter as classes abertas para extensão sem a ter alteração no código original é chamado Opem Closed Principle.

Os próprios engenheiros ,como o Senhor Sun admitir alguns erros de design da APIs antigas com classe java util Calendar .

Por isso recorrermos ás APIs com terceira alternativa para o senhor Joda time onde encontrar entidade como datas ,horas e intervalos imutáveis, objetos imutáveis são mais simples de se lidar.

Enquanto que objeto mutáveis tem que um certo cuidado adicional ,cujo objetivo é evitar alterações inesperadas.Contudo o API da linguagem Java usa a imutabilidade como vantagem para fazer cache e reaproveita mento de instâncias.

O desgin pattern flvweight tem como objetivo diminuir o uso da memória .O estado inconsistente fica escondido na lógica da construção e o novo estado referência compartilhado por mais de uma thread.

Tendo duas linguagens puras como Ertang e Haskell,uma vez que a sua característica e de trabalhar com valores imutáveis,quando classe imutável implementada com calendasrs precisará trabalhar com as copias defensivas dois momentos.

Com calendar também o implementar cloneable ,caso contrário precisariamos fazer a copia manualmente ,criando um objeto e alterando os atributos pertinentes um a um.

Era recomendado criar getters e setters para serem invocados no preenchimento de cada campo visual da sua interface gráfica com o usuário ,cunhando o termo JavaBean.

25 á 34

O Garbage Collector (GC) é um componente vital e fundamental da JVM ,responsável por liberar memória não utilizada.

A abordagem de acumular lixo antes de realizar coletas maiores é eficiente e evita fragmentação de memória.

Estudos extensivos levaram ao abandono de algoritmos mais antigos ,como o refence counting.

Uma vez que modelo de memoria java permite a mudança de objetos de lugar ,facilitando assim a executação de VM.

Entretanto o heap sendo configuração ,com opções como Xms e Xmx, impacta a alocação de memoria na JVM.

Uma vez que já vimos a opções do garbage collector da JVM é importante para otimizar o seu desempenho na aplicação.

4º 35 á 44

Entretanto uma versão de Hibernate resultar em vários problemas .

Tendo erros como SuchMethodError visto que ocorre quando espera uma versão antiga que não existe na nova versão .

O mesmo problema acontecer no DLL Hell,frequente mente chamado de classloader hell na java .

Tendo diferentes classloaders que carregam classes de diretórios em comum,levando a class CastException.

Pois uma classe sendo carregada por classloaders diferentes .

A arquitetura tradicional dificulta que aplicação a ser substituida por componentes do classloader do container.

No entanto o modelo Tomcat permitem essa substituição.

A ordem de resolução das classes passa a ser :primeiro o Bootstrap,depois as classes da aplicação e depois as compartilhadas do Container.

Bom dia , venho por este meio submeter o resumo do livro. 1á 14.

A plataforma java ,foi lançada em 1995 pelo Senhor Sun e liderada por Senhor James Gosling,consiste na Maquina Virtual-Java (JVM),um extenso conjunto de APIs e a linguagem java.

A JVM executa bytecodes, instruções genéricas que são compiladas a partir do codigo fonte java proporcionando portabilidade .

A plataforma Java -oferece duas distribuições principais 😮 JDK, focado no desenvolvimento, e o destinada á execução de aplicativo Java.

AJVM sendo importante para a portabilidade ,permite a implementação de diferentes fornecedores como a Hostpost da Oracle ,J9 da IBM e JRockit da BEA/Oracle.

Apesar de desafio como treinamento adicional para desenvolvedores e possíveis incompatibilidades entre implementações ,a plataforma Java se destaca por flexibilidade,portabilidade e capacidade de integrar diversas linguagens e tecnologias.

Este é 15á 24

O Garbage Collector (GC) é um dos principais componentes da JVM.

O GC é responsável por liberação da memória não utilizada ,usando o algoritmo generational copying que divide objetos em gerações ,copiandos os sobreviventes para próxima geração.

O algoritmo generational copying atual nos objetos sobreviventes,não nos descartados ,proporcionado eficiência .

A adaptação á hipótese das gerações e práticas de orientação a objetos ,como criar objetos pequenos e encapsulados,é crucial.

Algoritmos ingênuos de GC podem causas fragmentação, mas o generational copying agrupada objetos sobreviventes, evitando esse problema .

Tendo a compreensão dessas opções e do GC da JVM pode influenciar significativamente o desempenho de uma aplicação.

Bom dia ,venho submeter o 6º resumo do livro .

                                               65 á 74       

Esse tipo de classe tem uma característica bem procedural, fortemente sinalizada pela ausência de atributos e excesso do uso de métodos como funções (deposita e saca poderiam ser estáticos).

 Além disso, pode-se dizer que esta classe tem uma intimidade inapropriada com a classe Conta, pois conhece demais sua implementação interna.

 Repare que o método saca verifica primeiro se o saldo é maior que o valor a ser sacado, para, então, retirar o dinheiro.

Tópicos de Orientação a Objetos podemos unir a lógica de negócio aos dados de uma maneira simples, inserindo métodos na classe conta e removendo os que apenas acessam e modificam diretamente seus atributos.

Aqui mantivemos o getSaldo, pois faz parte do domínio.

 Também adicionamos algumas manipulações ao método saca, e poderíamos debitar algum imposto em cima de qualquer movimentação financeira no método deposita.

 Enriqueça suas classes com métodos de negócio, para que não se tornem apenas estruturas de dados.

Para isso, cuidado ao colocar getters e setters indiscriminadamente.

 Devemos encapsular os dados em atributos de objetos e, ainda, lembrar que a orientação a objetos prega a troca de mensagens (invocação de métodos) de maneira a concentrar as responsabilidades a quem pertence os dados. O

próprio Alan Kay, que cunhou o termo “programação orientada a objetos”, ressalta que “o termo foi uma má escolha, pois diminui a ênfase da ideia mais importante, a troca de mensagens”.

 Considere Domain-Driven Design Casa do Código a real necessidade dos getters e setters.

Por exemplo, a necessidade de um método setId para a chave primária torna-se discutível no momento em que um framework utiliza reflection ou manipulação de bytecode para ler atributos privados.

Algumas vezes, os getters e setters são, sim, necessários, e alguns patterns até mesmo precisam de uma separação de lógica de negócios dos respectivos dados.

 É muito fácil terminar colocando a lógica de negócio, que poderia estar em em nossas entidades, diretamente em Actions do Struts, ActionListeners do Swing e managed beans do JSF, transformando-os em transaction scripts.

Este modelo acaba ficando com um forte apelo procedural e vai diretamente na contramão das boas práticas de orientação a objetos e do Domain-Driven Design.

 Considere Domain-Driven Design Todo software é desenvolvido com um propósito concreto, para resolver problemas reais que acontecem com pessoas reais.

Todos os conceitos ao redor do problema a ser resolvido são o que denominamos domínio. O objetivo de toda aplicação é resolver as questões de um determinado domínio.

 Domain-Driven Design (DDD) significa guiar o processo de design da sua aplicação pelo domínio. Parece óbvio, mas muitos softwares não são projetados de acordo com o domínio em que atuam.

 Podemos perceber essa realidade analisando o código de diversos sistemas atuais, nos quais as entidades não condizem com a realidade dos usuários e são de difícil entendimento.

Segundo o DDD, é impossível resolver o problema no domínio do cliente sem entendê-lo profundamente.

 É claro que o desenvolvedor não quer se tornar um completo especialista na área do cliente, mas deve compreendê-la o suficiente para desenvolver guiado pelo domínio. Para isto acontecer, o ponto-chave é a conversa.

 Conversa constante e profunda entre os especialistas de domínio e os desenvolvedores. Aqueles que conhecem o domínio em detalhes devem transmitir conhecimento aos desenvolvedores.

 Juntos, chegarão a termos e vocábulos em comum, uma língua comum, que todos utilizem.

 Durante a conversa constante, cria-se um modelo do domínio (ou Domain Model).

É uma abstração do problema real, que envolve os aspectos do domínio que devem ser expressados no sistema, desenvolvida em parceria pelos especialistas do domínio e desenvolvedores.

 É este modelo que os desenvolvedores implementam em código, que deve ocorrer literalmente, item por item, como foi acordado por todos.

 Isto possibilita o desenvolvimento de um código mais claro, e, principalmente, que utiliza metáforas próprias do domínio em questão.

Seu programa deve expressar a riqueza do domain model.

Qualquer mudança no modelo deve ser refletida no código.

Caso o modelo se torne inviável para se implementar tecnicamente, ele deve ser mudado para se tornar implementável.

Esse processo não ocorre antes do início do projeto, mas é um trabalho constante, que deve ser revisitado a todo instante.

Praticando DDD, é comum encontrar situações em que o especialista e os desenvolvedores aprendem mais sobre o domínio e refatoram o código e suas entidades à medida que o projeto é desenvolvido e, por isso, práticas de Test Driven Design e refatoração são complementares a DDD.

 No DDD, seu código sempre será a expressão do modelo, que, por sua vez, é guiado pelo domínio.

 A principal literatura sobre Domain-Driven Design é o livro homônimo de Eric Evans.

Boa noite , venho submeter meu 5º resumo do livro.

55 á 64

Através de interfaces e composição, podemos criar desde um novo driver JDBC para um determinado banco de dados, ou flexibilizar trabalhos simples, como ordernar listas com Comparators implementando diferentes critérios de comparação.

Este princípio, de manter suas classes abertas para extensão sem a necessidade de alteração no código original, é chamado Open Closed Principle.

Evite herança, favoreça composição é um de dois princípios fundamentais de design do livro Design Patterns, com frequência referenciado na literatura.

A classe Calendar permite mudança no estado de suas instâncias e, portanto, diz-se que a classe é mutável.

 A classe String tem comportamento diferente.

 Todo método invocado em uma String, que parece modificá-la, sempre devolve uma nova Favoreça imutabilidade e simplicidade Casa do Código instância com a alteração requisitada, mas nunca altera a instância original.

Ao tornar uma classe imutável, uma ampla gama de problemas comuns desaparece. Simplicidade e previsibilidade Objetos imutáveis são muito mais simples de manipular que os mutáveis.

Objetos imutáveis não sofrem efeitos colaterais, pois têm comportamento previsível em relação ao seu estado.

Os próprios engenheiros da Sun admitiram alguns erros de design das APIs antigas, como a classe java.util.Calendar ser mutável.

Por isso, muitas vezes recorremos às APIs de terceiros, como a Joda Time, nas quais encontramos entidades de datas, horários e intervalos imutáveis.

Quando o objeto é mutável, para evitar que alguém o modifique, temos que tomar alguma precaução.

Uma solução, frequentemente usada com coleções através do Collections.unmodifiableList(List) e seus similares, é interfacear o objeto e embrulhá-lo de tal forma que os métodos expostos não possibilitem modificação.

 Em vez de passar a referência original adiante, passamos essa nova referência, cuja instância lança exceções em qualquer tentativa de modificação.

 Outra solução para objetos mutáveis é criar cópias defensivas do objeto.

 Em vez de devolver o objeto original que se deseja preservar, criamos uma cópia, por exemplo, através do método clone, e devolvemos esta cópia.

Tópicos de Orientação a Objetos não tem como alterar o objeto original, mas recebe uma cópia para uso próprio, que, se alterar, afetará apenas a si mesmo.

Objetos imutáveis são mais simples de se lidar.

Depois de sua criação, sempre saberemos seu valor e não precisamos tomar cuidados adicionais para preservá-lo.

 Objetos mutáveis, em contrapartida, com frequência necessitam de um cuidado adicional, cujo objetivo é evitar alterações inesperadas.

Otimizações de memória podemos tirar proveito da imutabilidade de outras formas.

 Como cada objeto representa apenas um estado, você não precisa mais do que uma instância para cada estado.

 A própria API da linguagem Java usa a imutabilidade como uma vantagem para fazer cache e reaproveitamento de instâncias.

 É o caso do pool de Strings da JVM, que faz com que Strings de mesmo conteúdo possam ser representadas por uma única instância compartilhada.

 O mesmo acontece em boa parte das implementações das classes wrapper como Integer.

Ao invocar Integer.valueOf(int), a referência a Integer devolvida pode ser fruto de um cache interno de objetos com números mais frequentemente solicitados.

Esse tipo de otimização só é possível com objetos imutáveis.

 É seguro compartilhar instâncias de Strings ou Integers com diferentes partes do programa, sem o risco de que uma alteração no objeto traga efeitos colaterais indesejados em outras partes do sistema.

E há mais possibilidades ainda para otimizações graças à imutabilidade. A classe String ainda se aproveita dessa característica para compartilhar seu array de char interno entre Strings diferentes.

Quando pedimos uma determinada substring, em vez de o Java criar um array de char com o pedaço em questão, ele devolve um novo objeto String, que internamente compartilha a referência para o mesmo array de char que a String original, e tem apenas os seus dois índices ajustados.

Essa otimização é uma implementação um pouco mais simples do design pattern flyweight, em que se propõe reaproveitar objetos com objetivo de diminuir o uso da memória.

 O próprio pool de Strings pode ser considerado um flyweight.

E poderíamos ir mais longe com o flyweight, implementando a concatenação de Strings apontando para diversas outras Strings internamente ao invés de copiar os dados para seu próprio array de char.

É válido também ressaltar o perigo de certas otimizações em alguns casos. Na otimização do substring, por exemplo, uma String pequena pode acabar segurando referência para um array de chars muito grande se ela foi originada a partir de uma String longa.

Isso impediria que o array maior fosse coletado, mesmo se não possuirmos referências para a String original.

Há também um excesso de memória consumida temporariamente.

Com imutabilidade, cada invocação de método cria uma nova cópia do objeto apenas com alguma alteração e, se isto estiver dentro de um laço, diversas cópias temporárias serão utilizadas, mas apenas o resultado final é guardado.

Desta forma, evitamos que duas escritas concorrentes se entrelacem e que leituras sejam capazes de acessar dados inconsistentes ou intermediários.

 A tarefa difícil é definir todas as regiões críticas e quais são mutuamente exclusivas; definir uma região muito grande gera perda de vazão (throughtput), enquanto uma de tamanho insuficiente implicará os mesmos problemas de não tê-las.

Em vez de recorrer aos recursos das linguagens, pensemos nesses objetos de forma diferente, evitando esse estado intermediário, não permitindo a mudança de valores.

 A vantagem é a thread-safety, pois, como não existem estados intermediários, não há como acessar nem modificar dados em momentos de inconsistência.

O estado inconsistente fica escondido na lógica de construção, e o novo estado só estará disponível quando terminar de ser construído, para então ter sua referência compartilhada por mais de uma thread.

As linguagens funcionais mais puras, como Erlang e Haskell, estão sendo utilizadas em ambientes de grande concorrência, dada sua característica de trabalhar quase que apenas com valores imutáveis.

 Perde-se o conceito de variável como o conhecemos, já que os valores não mudam; nascem e morrem com o mesmo estado.

Você é obrigado a programar apenas de maneira imutável, o que é uma enorme mudança de paradigma.

 Muitas dessas linguagens podem rodar sobre a JVM, como Scala, que, apesar de suportar mutabilidade, tem fortes raízes em programação funcional e recomenda o uso de imutabilidade. Cada invocação de método que cria uma situação nova, cria um estado novo, devolve a referência para um objeto novo.

Uma classe Periodo imutável, implementada com Calendars, precisará trabalhar com cópias defensivas em dois momentos.

Primeiro, quando receber algum Calendar como parâmetro e, depois, quando devolver algum Calendar que faça parte da composição do objeto.

 Se não copiarmos os objetos, é possível que algum código externo à classe Periodo altere os Calendars em questão, gerando inconsistência.

Cuidado com o modelo anêmico Casa do Código Aproveitamos aqui o fato de Calendar implementar Cloneable, caso contrário precisaríamos fazer a cópia manualmente, criando um objeto e alterando os atributos pertinentes um a um.

 Como nossa classe é imutável, se precisarmos calcular alguma informação que exija qualquer modificação, clonamos o objeto.

 E, com uma pequena modificação, podemos implementar o design pattern flyweight em nossa classe, compartilhando a instância do Calendar de início do período entre o objeto original e o novo, com uma semana adiada.

Para tanto, precisaríamos de um outro construtor privado para ser chamado no a dia Uma Semana que não fizesse o clone.

 Utilizar classes imutáveis traz um trabalho a mais junto com os diversos benefícios descritos. Cuidado com o modelo anêmico Um dos conceitos fundamentais da orientação a objetos é o de que você não deve expor seus detalhes de implementação.

 Encapsulando a implementação, podemos trocá-la com facilidade, já que não existe outro código dependendo desses detalhes, e o usuário só pode acessar seu objeto através do contrato definido pela sua interface pública.

 O método setSaldo é um bom exemplo disso, já que dificilmente o saldo em uma entidade Conta será simplesmente “substituído” por outro. Para alterar o saldo de uma conta, é necessária alguma operação que faça mais sentido para o domínio, como saques ou depósitos.

 Nunca crie um getter ou setter sem uma necessidade real; lembre-se de que precisamos que essa necessidade seja clara para criar qualquer método que colocamos em uma classe. Particularmente, os getters e setters são campeões quando falamos em métodos que acabam nunca sendo invocados e, além disso, grande parte dos utilizados poderia ser substituída por métodos de negócio.

 Essa prática foi incentivada nos primórdios do AWT, para o qual era recomendado criar getters e setters para serem invocados no preenchimento de cada campo visual da sua interface gráfica com o usuário, cunhando o termo JavaBean.

Os EJBs também contribuíram para esta prática, como será visto adiante.

Se for preciso, por exemplo, que uma taxa seja debitada toda vez que um depósito é realizado, será necessário percorrer todo o código e modificar Cuidado com o modelo anêmico Casa do Código essas diversas invocações.