Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
o
m
u
i
t
o
o
r
i
e
n
t
a
d
o
a
o
b
j
e
t
o
s
!
Problema de Design
Qual o problema no exemplo mostrado no slide? Cada mtodo efetua o clculo com base
no tipo de funcionrio especificado e retorna o nmero de aes.
Considere o que aconteceria se voc adicionasse mais dois ou trs tipos de funcionrio.
Seria preciso adicionar trs mtodos adicionais e, possivelmente, replicar cdigo
dependendo da lgica de negcios necessria para calcular as aes.
Claramente, essa no uma maneira adequada de tratar esse problema. Embora o cdigo
funcione, no ser de fcil leitura e provvel que crie bastante cdigo duplicado.
Programao Java SE 7 4 - 12
O
r
a
c
l
e
U
n
i
v
e
r
s
i
t
y
a
n
d
E
r
r
o
r
:
Y
o
u
a
r
e
n
o
t
a
V
a
l
i
d
P
a
r
t
n
e
r
u
s
e
o
n
l
y
T
H
E
S
E
e
K
I
T
M
A
T
E
R
I
A
L
S
A
R
E
F
O
R
Y
O
U
R
U
S
E
I
N
T
H
I
S
C
L
A
S
S
R
O
O
M
O
N
L
Y
.
C
O
P
Y
I
N
G
e
K
I
T
M
A
T
E
R
I
A
L
S
F
R
O
M
T
H
I
S
C
O
M
P
U
T
E
R
I
S
S
T
R
I
C
T
L
Y
P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.
Aplicando o Polimorfismo
Uma prtica recomendada especificar parmetros e criar
mtodos que usem a forma mais genrica possvel do seu
objeto.
public class EmployeeStockPlan {
public int grantStock (Employee e) {
// perform a calculation based on Employee data
}
}
// In the application class
EmployeeStockPlan esp = new EmployeeStockPlan ():
Manager m = new Manager ();
int stocksGranted = grantStock (m);
...
Use a Forma Mais Genrica
Uma prtica recomendada criar mtodos que usem a forma mais genrica possvel do seu
objeto.
Nesse caso, Employee uma classe bsica adequada para usar como ponto de partida.
Mas como voc sabe qual tipo de objeto especificado? A resposta est no prximo slide.
Programao Java SE 7 4 - 13
O
r
a
c
l
e
U
n
i
v
e
r
s
i
t
y
a
n
d
E
r
r
o
r
:
Y
o
u
a
r
e
n
o
t
a
V
a
l
i
d
P
a
r
t
n
e
r
u
s
e
o
n
l
y
T
H
E
S
E
e
K
I
T
M
A
T
E
R
I
A
L
S
A
R
E
F
O
R
Y
O
U
R
U
S
E
I
N
T
H
I
S
C
L
A
S
S
R
O
O
M
O
N
L
Y
.
C
O
P
Y
I
N
G
e
K
I
T
M
A
T
E
R
I
A
L
S
F
R
O
M
T
H
I
S
C
O
M
P
U
T
E
R
I
S
S
T
R
I
C
T
L
Y
P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.
Usando a Palavra-chave instanceof
A linguagem Java fornece a palavra-chave instanceof para
determinar o tipo de classe de um objeto no runtime.
1 public class EmployeeStockPlan {
2 public int grantStock (Employee e) {
3 // perform a calculation based on Employee data
4 if (e instanceof Manager) {
5 // process Manager stock grant
6 } else if (e instanceof Engineer) {
7 // process Engineer stock grant
8 } else if (e instanceof Admin) {
9 // process Admin stock grant
10 } else {
11 // perhaps an error a generic Employee?
12 }
13 }
14}
Nessa classe EmployeeStockPlan modificada, o mtodo grantStock usa instanceof
para determinar qual tipo de Employee foi especificado para o mtodo.
Outra abordagem desse problema usar o novo recurso no JDK 7 para ativar objetos String:
String type = emp.getClass().getSimpleName();
switch (type) {
case "Engineer":
// process Engineer grant
case "Admin":
// process Admin grant
case "Manager":
// process Manager grant
case "Director":
// process Director grant
default:
// error result
}
Programao Java SE 7 4 - 14
O
r
a
c
l
e
U
n
i
v
e
r
s
i
t
y
a
n
d
E
r
r
o
r
:
Y
o
u
a
r
e
n
o
t
a
V
a
l
i
d
P
a
r
t
n
e
r
u
s
e
o
n
l
y
T
H
E
S
E
e
K
I
T
M
A
T
E
R
I
A
L
S
A
R
E
F
O
R
Y
O
U
R
U
S
E
I
N
T
H
I
S
C
L
A
S
S
R
O
O
M
O
N
L
Y
.
C
O
P
Y
I
N
G
e
K
I
T
M
A
T
E
R
I
A
L
S
F
R
O
M
T
H
I
S
C
O
M
P
U
T
E
R
I
S
S
T
R
I
C
T
L
Y
P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.
Converso de Referncias de Objeto
Aps usar o operador instanceof para verificar se o
objeto que voc recebeu como argumento uma subclasse,
possvel acessar a funcionalidade completa do objeto
convertendo a referncia:
1 public void modifyDeptForManager (Employee e, String dept) {
2 if (e instanceof Manager) {
3 Manager m = (Manager) e;
4 m.setDeptName (dept);
5 }
6 }
Sem a converso em Manager, o mtodo setDeptName
no seria compilado.
Embora uma referncia de superclasse genrica seja til para especificar objetos, talvez seja
necessrio usar um mtodo da subclasse.
No slide, por exemplo, voc precisa do mtodo setDeptName da classe Manager. Para
satisfazer o compilador, possvel converter uma referncia da superclasse genrica na
classe especfica.
No entanto, h regras para converso de referncias. Isso mostrado no prximo slide.
Programao Java SE 7 4 - 15
O
r
a
c
l
e
U
n
i
v
e
r
s
i
t
y
a
n
d
E
r
r
o
r
:
Y
o
u
a
r
e
n
o
t
a
V
a
l
i
d
P
a
r
t
n
e
r
u
s
e
o
n
l
y
T
H
E
S
E
e
K
I
T
M
A
T
E
R
I
A
L
S
A
R
E
F
O
R
Y
O
U
R
U
S
E
I
N
T
H
I
S
C
L
A
S
S
R
O
O
M
O
N
L
Y
.
C
O
P
Y
I
N
G
e
K
I
T
M
A
T
E
R
I
A
L
S
F
R
O
M
T
H
I
S
C
O
M
P
U
T
E
R
I
S
S
T
R
I
C
T
L
Y
P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.
Regras de Converso
As converses ascendentes sempre so permitidas e no
exigem um operador de converso.
Director d = new Director();
Manager m = new Manager();
Employee e = m; // OK
Manager m = d; // OK
Employee e = d; // OK
Programao Java SE 7 4 - 16
O
r
a
c
l
e
U
n
i
v
e
r
s
i
t
y
a
n
d
E
r
r
o
r
:
Y
o
u
a
r
e
n
o
t
a
V
a
l
i
d
P
a
r
t
n
e
r
u
s
e
o
n
l
y
T
H
E
S
E
e
K
I
T
M
A
T
E
R
I
A
L
S
A
R
E
F
O
R
Y
O
U
R
U
S
E
I
N
T
H
I
S
C
L
A
S
S
R
O
O
M
O
N
L
Y
.
C
O
P
Y
I
N
G
e
K
I
T
M
A
T
E
R
I
A
L
S
F
R
O
M
T
H
I
S
C
O
M
P
U
T
E
R
I
S
S
T
R
I
C
T
L
Y
P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.
Regras de Converso
Para converses descendentes, o compilador precisa estar
convencido de que a converso , pelo menos, possvel.
Employee e = new Manager();
Manager m = new Manager();
Manager m = (Manager)e;
// Would also work if
// e was a Director obj
Director d = (Director)m;
// fails at run time
Engineer eng = (Engineer)m;
// compiler error
Converses Descendentes
Com uma converso descendente, o compilador simplesmente determina se a converso
possvel. Caso se trate da converso em uma subclasse, possvel que a converso tenha
sucesso.
Observe que, no runtime, a converso resultar em uma
java.lang.ClassCastException se a referncia de objeto for de uma superclasse e
no do tipo classe ou de uma subclasse.
A converso da varivel e em uma referncia Manager m satisfaz o compilador, pois
Manager e Employee esto na mesma hierarquia de classe e, por isso, a converso poder
ter sucesso. Essa converso tambm funciona no runtime, pois, na verdade, a varivel e
um objeto Manager. Essa converso tambm funcionaria no runtime se e apontasse para
uma instncia de um objeto Director.
A converso da varivel m em uma instncia de Director satisfaz o compilador. No entanto,
como m , na verdade, uma instncia de Manager, essa converso falhar no runtime com
uma ClassCastException.
Por fim, qualquer converso que esteja fora da hierarquia de classe falhar, como a
converso de uma instncia de Manager em Engineer. Um gerente (Manager) e um
engenheiro (Engineer) so ambos funcionrios, mas um gerente (Manager) no um
engenheiro (Engineer).
Programao Java SE 7 4 - 17
O
r
a
c
l
e
U
n
i
v
e
r
s
i
t
y
a
n
d
E
r
r
o
r
:
Y
o
u
a
r
e
n
o
t
a
V
a
l
i
d
P
a
r
t
n
e
r
u
s
e
o
n
l
y
T
H
E
S
E
e
K
I
T
M
A
T
E
R
I
A
L
S
A
R
E
F
O
R
Y
O
U
R
U
S
E
I
N
T
H
I
S
C
L
A
S
S
R
O
O
M
O
N
L
Y
.
C
O
P
Y
I
N
G
e
K
I
T
M
A
T
E
R
I
A
L
S
F
R
O
M
T
H
I
S
C
O
M
P
U
T
E
R
I
S
S
T
R
I
C
T
L
Y
P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.
Substituindo Mtodos de Objeto
Uma das vantagens da herana nica que, por default, toda
classe tem um objeto pai. A classe-raiz de toda classe Java
java.lang.Object.
No necessrio declarar que a sua classe estende
Object. O compilador faz isso para voc.
public class Employee { //... }
equivalente a:
public class Employee extends Object { //... }
A classe-raiz contm vrios mtodos no-finais, mas trs
para os quais importante considerar a substituio:
toString, equals e hashCode
Melhor Prtica: Sobrecarregar Mtodos de Objeto
A classe java.lang.Object a classe-raiz de todas as classes na linguagem de
programao Java. Por default, todas as classes subclassificaro Object.
Object define vrios mtodos no-finais que foram criados para serem substitudos pela sua
classe. So eles: equals, hashCode, toString, clone e finalize. H trs desses
mtodos para os quais voc deve considerar a substituio.
Programao Java SE 7 4 - 18
O
r
a
c
l
e
U
n
i
v
e
r
s
i
t
y
a
n
d
E
r
r
o
r
:
Y
o
u
a
r
e
n
o
t
a
V
a
l
i
d
P
a
r
t
n
e
r
u
s
e
o
n
l
y
T
H
E
S
E
e
K
I
T
M
A
T
E
R
I
A
L
S
A
R
E
F
O
R
Y
O
U
R
U
S
E
I
N
T
H
I
S
C
L
A
S
S
R
O
O
M
O
N
L
Y
.
C
O
P
Y
I
N
G
e
K
I
T
M
A
T
E
R
I
A
L
S
F
R
O
M
T
H
I
S
C
O
M
P
U
T
E
R
I
S
S
T
R
I
C
T
L
Y
P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.
Mtodo Object toString
O mtodo toString chamado sempre que uma instncia
da sua classe especificada para um mtodo que recebe um
objeto String, como println:
Employee e = new Employee (101, "Jim Kern", ...)
System.out.println (e);
possvel usar toString para fornecer informaes
sobre a instncia:
public String toString () {
return "Employee id: " + empId + "\n"
"Employee name:" + name;
}
Essa abordagem melhor para obter detalhes sobre a sua
classe do que criar o seu prprio mtodo getDetails.
Observao: Em alguns casos, voc desejar ter a possibilidade de imprimir o nome da
classe que est executando um mtodo. O mtodo getClass() um mtodo Object
utilizado para retornar uma instncia de objeto Class, e o mtodo getName() fornece o
nome totalmente qualificado da classe de runtime.
getClass().getName(); // returns the name of this class instance
Esses mtodos esto na classe Object.
Programao Java SE 7 4 - 19
O
r
a
c
l
e
U
n
i
v
e
r
s
i
t
y
a
n
d
E
r
r
o
r
:
Y
o
u
a
r
e
n
o
t
a
V
a
l
i
d
P
a
r
t
n
e
r
u
s
e
o
n
l
y
T
H
E
S
E
e
K
I
T
M
A
T
E
R
I
A
L
S
A
R
E
F
O
R
Y
O
U
R
U
S
E
I
N
T
H
I
S
C
L
A
S
S
R
O
O
M
O
N
L
Y
.
C
O
P
Y
I
N
G
e
K
I
T
M
A
T
E
R
I
A
L
S
F
R
O
M
T
H
I
S
C
O
M
P
U
T
E
R
I
S
S
T
R
I
C
T
L
Y
P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.
Mtodo Object equals
O mtodo Object equals compara somente referncias de objeto.
Se houver dois objetos x e y em uma classe, x ser igual a y
se, e somente se, x e y fizerem referncia ao mesmo objeto.
Exemplo:
Employee x = new Employee (1,"Sue","111-11-1111",10.0);
Employee y = x;
x.equals (y); // true
Employee z = new Employee (1,"Sue","111-11-1111",10.0);
x.equals (z); // false!
Como o que desejamos testar o contedo do objeto Employee,
precisamos substituir o mtodo equals:
public boolean equals (Object o) { ... }
O mtodo equals de Object determina (por default) somente se os valores de duas
referncias de objeto apontam para o mesmo objeto. Basicamente, o teste na classe Object
simplesmente o seguinte:
Se x == y, retornar true.
Para um objeto (como Employee) que contm valores, essa comparao no suficiente,
especialmente se desejarmos verificar se existe um e somente um funcionrio com um ID
especfico.
Programao Java SE 7 4 - 20
O
r
a
c
l
e
U
n
i
v
e
r
s
i
t
y
a
n
d
E
r
r
o
r
:
Y
o
u
a
r
e
n
o
t
a
V
a
l
i
d
P
a
r
t
n
e
r
u
s
e
o
n
l
y
T
H
E
S
E
e
K
I
T
M
A
T
E
R
I
A
L
S
A
R
E
F
O
R
Y
O
U
R
U
S
E
I
N
T
H
I
S
C
L
A
S
S
R
O
O
M
O
N
L
Y
.
C
O
P
Y
I
N
G
e
K
I
T
M
A
T
E
R
I
A
L
S
F
R
O
M
T
H
I
S
C
O
M
P
U
T
E
R
I
S
S
T
R
I
C
T
L
Y
P
R
O
H
I
B
I
T
E
D
Copyright 2012, Oracle e/ou suas empresas afiliadas. Todos os direitos reservados.
Substituindo equals em Employee
Um exemplo de substituio do mtodo equals na classe
Employee compara cada campo quanto igualdade:
1 public boolean equals (Object o) {
2 boolean result = false;
3 if ((o != null) && (o instanceof Employee)) {
4 Employee e = (Employee)o;
5 if ((e.empId == this.empId) &&
6 (e.name.equals(this.name)) &&
7 (e.ssn.equals(this.ssn)) &&
8 (e.salary == this.salary)) {
9 result = true;
10 }
11 }
12 return result;
13 }
Esse teste equals simples verifica primeiro se o objeto especificado no nulo e, em
seguida, verifica se uma instncia de uma classe Employee (todas as subclasses tambm
so funcionrios; por isso, funciona). Em seguida, Object convertido em Employee, e
cada campo em Employee verificado quanto igualdade.
Observao: Para tipos de String, necessrio usar o mtodo equals para testar as
strings caractere por caractere quanto igualdade.
Programao Java SE 7 4 - 21
O
r
a
c
l
e
U
n
i
v
e
r
s
i
t
y
a
n
d
E
r
r
o
r
:
Y
o
u
a
r
e
n
o
t
a
V
a
l
i
d
P
a
r
t
n
e
r
u
s
e
o
n
l
y
T
H
E
S
E
e
K
I
T
M
A
T
E
R
I
A
L
S
A
R
E
F
O
R
Y
O
U
R
U
S
E
I
N
T
H
I
S
C
L
A
S