java 09

Upload: drescher

Post on 30-May-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/14/2019 Java 09

    1/27

    1

    Reuso comReuso com

    HeranHerana ea e

    ComposiComposioo

    Java 2 Standard Edition

    Helder da Rochawww.argonavis.com.br

  • 8/14/2019 Java 09

    2/27

    2

    Como aumentar as chances de reuso

    Separar as partes que podem mudar das partes queno mudam. Exemplo: bibliotecas Programador cliente deve poder usar o cdigo sem apreocupao de ter que reescrever seu cdigo caso surjam

    verses futuras

    Programador de biblioteca deve ter a liberdade de fazermelhoramentos sabendo que o cliente no ter quemodificar o seu cdigo

    Em Java: esconder do cliente Mtodos que no fazem parte da interface de uso Mtodos que no fazem parte da interface de herana

    Todos os atributos de dados

  • 8/14/2019 Java 09

    3/27

    3

    Reuso

    Quando voc precisa de uma classe, vocpode Usar uma classe que faz exatamente o que voc

    deseja fazer

    Escrever uma classe do zero Reutilizar uma classe existente com composio Reutilizar uma classe existente ou estrutura de

    classes com herana

  • 8/14/2019 Java 09

    4/274

    Composio vs. Herana

    Composio pura Herana pura

    Extenso

    Carro

    Motor

    Roda[]

    Porta[]

    Forma

    desenha()apaga()

    Circulo

    desenha()

    apaga()

    Quadrado

    desenha()

    apaga()

    Triangulo

    desenha()

    apaga()

    Util

    um()

    dois()

    MaisUtil

    tres()

    quatro()

    Ao reutilizar

    uma classe

    a composio

    deve ser sua

    escolha preferencial

  • 8/14/2019 Java 09

    5/275

    Composio em Java

    Objetos podem serinicializados no construtor

    Flexibilidade Pode trocar objetos durante a

    execuo! Relacionamento

    "TEM UM"

    NovaClasse

    Instncia

    de Objeto 1

    Instncia

    de Objeto 3

    Instnciade Objeto 2

    class NovaClasse {

    Um um = new Um();

    Dois dois = new Dois();

    Tres tres = new Tres();

    }

  • 8/14/2019 Java 09

    6/276

    Herana em Java

    Herana pura

    (sem extenso)

    Forma

    desenha()

    apaga()

    Circulo

    desenha()

    Quadrado

    desenha()apaga()

    Triangulo

    desenha()apaga()

    class Forma {

    public void desenha() {/*...*/

    }public void apaga() {

    /*...*/

    }}

    class Circulo extends Forma {

    public void desenha() {/* nova implementao */

    }}

    interface original automaticamente duplicadanas classes derivadas

    Campos de dadosda classe base tambm

    so duplicados

    Se membro derivado no for redefinido, implementao original usada

    Assinatura do mtodo tem que ser igualou sobreposio no ocorrer (poderocorrer sobrecarga no desejada)

  • 8/14/2019 Java 09

    7/277

    Composio e Herana

    Composio e herana no so mutuamenteexclusivasAs tcnicas podem ser usadas em conjunto para

    obter os melhores resultados de cada uma

    No desenvolvimento, composio a tcnicapredominante Herana geralmente ocorre mais no design de

    tipos

  • 8/14/2019 Java 09

    8/278

    Quando usar?Composio ou herana?

    1. Identifique os componentes do objeto, suas partes Essas partes devem ser agregadas ao objeto via

    composio ( parte de) 2. Classifique seu objeto e tente encontrar uma

    semelhana de identidade com classes existentes Herana s deve ser usada se voc puder comparar seuobjeto A com outro B dizendo, que A " UM tipo de..." B. Tipicamente, herana s deve ser usada quando voc

    estiver construindo uma famlia de tipos (relacionadosentre si)

  • 8/14/2019 Java 09

    9/279

    Modificadores relacionados

    No projeto de uma classe, preciso definir duas interfaces Interface para uso de classes via composio

    Interface para uso de classes via herana A palavraprotected deve ser usada para declarar os

    mtodos, construtores e variveis que destinam-se interface de herana

    Elementos usados em interface para composio devem serdeclarados public

    A palavrafinal usada para limitar o uso das classes,variveis e mtodos quando existe a possibilidade de haverherana: impede que implementaes ou valores sejamalterados

  • 8/14/2019 Java 09

    10/2710

    Constantes

    Para declarar uma constante, defina-a com um modificadorfinalfinal XIS = 0;

    public static final IPSILON = 12;

    Qualquer varivel declarada como final tem que serinicializada no momento da declarao

    Exceo: argumentos constantes em mtodos - valores no mudamdentro do mtodo (uso em classes internas) Uma constante de tipo primitivo no pode receber outro valor Uma constante de referncia no pode ser atribuda a um

    novo objeto O objeto, porm, no constante (apenas a referncia o ). Os

    atributos do objeto podem ser alterados

  • 8/14/2019 Java 09

    11/27

    11

    Mtodos finais

    Mtodo declarado comofinal no pode sersobreposto

    Motivos para declarar um mtodofinal Design: a verso final (o mtodo est "pronto") Eficincia: compilador pode embutir o cdigo do mtodo

    no lugar da chamada e evitar realizar chamadas emtempo de execuo: pode limitar o uso de sua classe Procedimentos chamados de dentro de construtores:

    quaisquer mtodos chamados de dentro de construtoresdevem ser final. Mtodos declarados comoprivate so

    implicitamentefinal

  • 8/14/2019 Java 09

    12/27

    12

    Classes finais

    A classe tambm pode ser declaradafinal

    public final class Definitiva { ... } Se uma classe no-final tiver todos os seus mtodos

    declarados como final, possvel herdar os mtodos,

    acrescentar novos, mas no sobrepor Se uma classe for declarada como final

    No possvel estender a classe (a classe nunca poder

    aparecer aps a clusula extends de outra classe) Todos os mtodos da classe so finais

    til em classes que contm funes utilitrias e

    constantes apenas (ex: classe Math)

  • 8/14/2019 Java 09

    13/27

  • 8/14/2019 Java 09

    14/27

    14

    public

    Acessvel na prpria classe

    nas subclasses nas classes do mesmo pacote em todas as outras classes

    Use para construtores e mtodos que fazem parte da interface doobjeto

    mtodos estticos utilitrios constantes (estticas) utilitrias Evite usar em

    construtores e mtodos de uso restrito campos de dados de objetos

    Classe

    +campoPublico: tipo

    +metodoPublico: tipo

  • 8/14/2019 Java 09

    15/27

    15

    protected

    Acessvel na prpria classe

    nas subclasses nas classes do mesmo pacote Use para

    construtores que s devem ser chamados pelas subclasses(atravs de super()) mtodos que s devem ser usados se sobrepostos

    Evite usar em construtores em classes que no criam objetos mtodos com restries sobreposio

    campos de dados de objetos

    Classe

    #campoProt: tipo

    #metodoProt: tipo

  • 8/14/2019 Java 09

    16/27

    16

    package-private

    Modificador ausente se no houver outro modificador de acesso, o acesso

    "package-private". Acessvel

    na prpria classe nas classes e subclasses do mesmo pacote

    Use para construtores e mtodos que s devem ser chamados pelas

    classes e subclasses do pacote

    constantes estticas teis apenas dentro do pacote Evite usar em construtores em classes que no criam objetos mtodos cujo uso externo seja limitado ou indesejvel campos de dados de objetos

    Classe

    ~campoAmigo: tipo

    ~metodoAmigo: tipo

  • 8/14/2019 Java 09

    17/27

    17

    private

    Acessvel na prpria classe (nos mtodos, funes estticas, blocos

    estticos e construtores) Use para

    construtores de classes que s devem criar um nmero

    limitado de objetos mtodos que no fazem parte da interface do objeto funes estticas que s tm utilidade dentro da classe

    variveis e constantes estticas que no tm utilidade ouno podem ser modificadas fora da classe campos de dados de objetos

    Classe

    -campoPrivate: tipo

    -metodoPrivate: tipo

  • 8/14/2019 Java 09

    18/27

    18

    Observaes sobre acesso

    Classes e interfaces (exceto classes internas) S podem ser package-private ou public

    Construtores Se private, criao de objetos depende da classe Se protected, apenas subclasses (alm da prpria classe e

    classes do pacote) podem criar objetos Vriveis e constantes

    O acesso afeta sempre a leitura e alterao. Efeitos

    "read-only" e "write-only" s podem ser obtidos por meiode mtodos Variveis locais

    Usar modificadores de acesso dentro dos mtodos ilegale no faz sentido pois variveis locais s tm escopo local

  • 8/14/2019 Java 09

    19/27

    Exemplo

  • 8/14/2019 Java 09

    20/27

    20

    Exemplo

  • 8/14/2019 Java 09

    21/27

    21

    Mais sobre 'static'

    Variveis declaradas como 'static'existem antes de existir qualquerobjeto da classe S existe uma varivel static,

    independente do nmero de objetoscriado com a classe

    Podem ser chamadas externamente pelonome da classe

    Color.red, System.out,

    BorderLayout.NORTH

    Podem tambm ser chamadasatravs da referncia de um objeto(evite usar este mtodo)

    class Duas {

    int x;static int y;

    }

    (...)Duas d1 = new Duas();

    Duas d2 = new Duas();

    d1.x = 5;

    d2.x = 10;

    //Duas.x = 60; // ilegal!d1.y = 15;

    d2.y = 30;

    Duas.y = 45;

    (...)

    mesmavarivel!

    Use esta notaoapenas

    x 10

    x 05

    45

    #

    #

    d1

    d2

    y

    ClassecampoStatic: tipo

    metodoStatic: tipo

  • 8/14/2019 Java 09

    22/27

    22

    Mtodos static

    Mtodos static nunca so sobrepostos Mtodo static de assinatura igual na

    subclasse apenas "oculta" original

    No h polimorfismo: mtodo estsempre associado ao tipo da classe(e no instncia)

    Exemplo: considere as classes abaixo

    O cdigo a seguir

    ir imprimir:

    como ocorreriase os mtodosfossem de instncia No chame mtodos static

    via referncias! Use sempre:Classe.metodo()

    class Beta extends Alfa {static void metodo() {

    System.out.println("Beta!");}

    }

    class Alfa {static void metodo() {

    System.out.println("Alfa!");}

    }

    Alfa pai = new Alfa ();pai.metodo();Beta filho1 = new Beta ();filho1.metodo();Alfa filho2 = new Beta ();filho2.metodo();

    Alfa!

    Beta!

    Alfa!

    Alfa!

    Beta!

    Beta!

    e no...

    Classe que s permite

  • 8/14/2019 Java 09

    23/27

    23

    Classe que s permiteum objeto (Singleton pattern)

    public class Highlander {

    private Highlander() {}

    private static Highlander instancia;

    public static Highlander criarInstancia() {

    if (instancia == null)instancia = new Highlander();

    }

    return instancia;

    }

    } public class Fabrica {

    public static void main(String[] args) {

    Highlander h1, h2, h3;

    //h1 = new Highlander(); // nao compila!

    h2 = Highlander.criarInstancia();h3 = Highlander.criarInstancia();

    if (h2 == h3) {

    System.out.println("h2 e h3 so mesmo objeto!");

    }

    }}

    Esta classeimplementa opadro de projetoSingleton

    Esta classecria apenasum objeto

    Highlander

    Exerccios

  • 8/14/2019 Java 09

    24/27

    24

    1. Implemente a seguinte hierarquia de classes

    a) Os dados representam propriedades (pares get/set) e no

    campos de dados (que devem ser private) b) Implemente equals(), toString() e hashCode() e construtores em

    cada classe biblioteca.*

    biblioteca

    Exerccios

    Publicacao

    +codigo: int

    +titulo: String

    +editor: Editor

    +data: Date

    Livro

    assunto: Assuntoautores: Autor[]

    Revista

    artigos: Artigo[]

    Artigo

    autores: Autor[]palavrasChave: String[]

    Editor+nome: String

    Autor+nome: String

    +sobrenome: String

    fachada

    Biblioteca+addAutor(Autor)

    +addEditor(Editor)

    +findAutor(int)

    +findEditor(int)

    +addPub(Publicacao)

    +removePub(int)

    +removeAgente(int)+findPub(int)

    +findPubs(String)

    Assunto+codigo: String

    +assunto: String

    Agente+codigo: int

    Deixemtodos

    vazios

    Esta

    classe um

    Singleton

    Exerccios (2)

  • 8/14/2019 Java 09

    25/27

    25

    2. Implemente a classe abaixo

    3. Implemente os mtodos de Bibliotecapara que chamem os mtodos deRepositorioDados.

    4. Coloque tudo em um JAR.

    5. Escreva uma classe que contenha um main(), importe os pacotes dabiblioteca, crie uma Biblioteca e acrescente autores, livros, artigos,revistas, e imprima os resultados.

    Exerccios (2)

    biblioteca

    io

    ...

    +addPub(Publicacao)

    +removePub(String)

    +removeAgente(int)+findPub(int)

    +findPubs(String)

    -initAssuntos()

    RepositorioDados

    -assuntos: HashMap

    -agentes: HashMap

    -pubs: HashMap

    +addAutor(Autor)

    +addEditor(Editor)

    +findAutor(int)

    +findEditor(int)

    Inicie

    previamente

    os assuntos

    (veja slide

    seguinte)

    A d R D d ( h )

  • 8/14/2019 Java 09

    26/27

    26

    Apndice: RepositorioDados (trecho)

    private java.util.HashMap assuntos =

    new java.util.HashMap();

    public voidinitAssuntos() {assuntos = new java.util.HashMap(10);

    assuntos.put("000", "Generalidades");

    assuntos.put("100", "Filosofia");

    assuntos.put("200", "Religio");assuntos.put("300", "Cincias Sociais");

    assuntos.put("400", "Lnguas");

    assuntos.put("500", "Cincias Naturais");

    assuntos.put("600", "Cincias Aplicadas");

    assuntos.put("700", "Artes");

    assuntos.put("800", "Literatura");

    assuntos.put("900", "Histria");}

  • 8/14/2019 Java 09

    27/27