java 09
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