original utilizar um outro metodo publico (ou protegido) daclasse e um fator de fragilizacao da implementacao. Deveria estar bemdocumentado e quem fosse estendera classe HashSet tem a obrigacao de levar em consideracao. Mas nao se cobretanto. A API do Java tinha e ainda tem diversas classes com inumeros problemasde projeto. Novosmetodos podem ser acrescentados na superclasse e isso tambem pode quebrar ofuncionamento da subclasse. Umbom substituto na maior parte dos casos onde heranca pode ser aplicada e autilizacao do Decorator Pattern.Item 17 Projete e documente para herancaou entao proibaHeranca e seguraquando utilizada em classes internas da API, sobre o controle da mesma equipe.Se deixar uma classe da API passivel de extensao deve-se tomar algumas precaucoes.Uma classeprojetada para ser estendida deve documentar com precisao detalhes deimplementacao de seus metodos publicos e protegidos. Mais precisamente, devedocumentar quando ela mesma fizer uso de seus proprios metodos. A documentacaodeve incluir quais metodos utiliza, em qual sequencia e como o resultado decada invocacao afeta o proximo processamento. Esta documentacao aparece porpadrao iniciando pela frase Esta implementacao .... Uma classe maissegura para extensao nunca invoca algum metodo passivel de sobreescrita (que ea fonte de todo mal). public class Super {// Broken - constructor invokes an overridable methodprivate int array[];public Super() {overrideMe();}public void overrideMe() { array = {1,2,3,4}; //O array nunca serainicializado quando a classe Sub for instanciada. O //polimorfismo faz com que ometodo chamado seja o overrideMe //sobrescrito.} }//fim da classe Superpublic final class Sub extends Super {private final Date date; Sub() {date = new Date(); //Quando a classe Sub einstanciada, primeiramente o constructor de Super e // chamado. Este por sua vezchama o metodo overrideMe sobrescrito na // classe Sub, o qual depende da inicializacaode date que ainda nao ocorreu.}// Overriding method invoked by superclass constructor@Override public void overrideMe() {System.out.println(date);}}//fim da classe SubItem 18 Prefira interfaces a classesabstratasHa duas maneiras de se definir um tipo abstrato de dado em Java: comclasses abstratas ou atraves de interfaces. As principais diferencas sao: Interfacenao admite implementar algum dos metodos declarados, uma classe abstrata sim. Paradefinir um tipo usando classe abstrata e preciso fazer uso de heranca, enquantoque com interfaces basta implementar todos os metodos do contrato. ComoJava admite apenas heranca simples, o uso de classes abstratas para definirtipos fica seriamente comprometido. Classespodem ser facilmente refatoradas para implementar uma interface, bastaacrescentar o implements eimplementar os metodos adicionais. Classes abstratas geram um efeito colateralmuito maior, forcando todos os descendentes estender a nova classe abstrata,sendo isso apropriado ou nao para eles. Interfacespodem ser usadas para criar misturas de comportamentos nao necessariamenterelacionados. Comparable e um tipoque gera esse efeito. O tipo primario de uma classe pode nao ter nada a ver como fato dela poder ser comparada com outros objetos mutualmenteequivalentes. Uma interface permite iradicionando comportamentos desejaveis sem ferir a coesao. Com a heranca simplesisso nao pode ser feito com o uso de classes abstratas. Criarhierarquias de tipos atraves de heranca e arriscado pois e uma decisao muitoforte que vai restringir seu projeto para sempre. Isso na maioria das vezes eruim porque, em geral, voce nao tem todas as informacoes sobre como uma classevai