1. O documento discute enumerações, a instrução switch e os limites dos tipos inteiros em Java.
2. Enumerações permitem definir tipos de dados com valores fixos. A instrução switch permite selecionar fluxos de execução com base em valores enumerados.
3. Os tipos inteiros em Java têm gamas limitadas, com valores mínimos e máximos definidos. A classe BigInteger permite trabalhar com números inteiros de precisão arbitrária.
4. Sexo
boolean?
int?
String?
Dias da semana
int?
String?
Meses do ano
Pontos cardinais
Estado civil
2013/2014 Fundamentos de Programação 4
Por exemplo:
class Human {
…
public boolean isFemale() {
return isFemale;
}
…
private boolean isFemale;
}
Problemas:
1. Representação indirecta.
2. Não se pode imprimir o sexo.
Por exemplo:
class Human {
…
public static final int MALE = 0;
public static final int FEMALE = 1;
…
public int getSex() {
return sex;
}
…
private int sex;
}
Problemas:
1. Inteiros podem tomar muito mais que os dois
valores pretendidos.
2. Ao imprimir surgem números.
Por exemplo:
class Human {
…
public static final
String MALE = "Male";
public static final
String FEMALE = "Female";
…
public String getSex() {
return sex;
}
…
private String sex;
}
Problemas:
1. Cadeias de caracteres podem tomar muito mais
que os dois valores pretendidos.
2. Comparação possível apenas com equals.
Mesmos problemas!
Mesmos problemas!
5. São classes, mas especiais
São tipos de valor (e de referência!)
Valores
Definidos explicitamente, por extensão
Em número finito
Fixos
Formam sequência
2013/2014 Fundamentos de Programação 5
!!??
6. Tipo de valores a representar Java
Sexo (masculino e feminino) public enum Sex {
MALE,
FEMALE
}
Dias da semana (de domingo a segunda-feira) public enum DayOfTheWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Pontos cardeais (Norte, Sul, Este e Oeste) public enum CardinalDirection {
NORTH,
SOUTH,
EAST,
WEST
}
2013/2014 Fundamentos de Programação 6
7. public static void main(final String[] arguments) {
final DayOfTheWeek day = DayOfTheWeek.MONDAY;
DayOfTheWeek someDay = DayOfTheWeek.FRIDAY;
out.println("Monday is " + day + ".");
someDay = DayOfTheWeek.valueOf("FRIDAY");
someDay = DayOfTheWeek.valueOf("Friday");
if (someDay == DayOfTheWeek.FRIDAY)
out.println("Some day is Friday.");
out.println("Some day is " + someDay + ".");
}
2013/2014 Fundamentos de Programação 7
_Monday is MONDAY.
_
Monday is MONDAY.
Some day is Friday.
_
Monday is MONDAY.
Some day is Friday.
Some day is FRIDAY.
_
8. Disponibilizado automaticamente
Devolve valor enumerado dada cadeia de caracteres
com o seu nome exacto
Exemplo
public enum Sex { MALE, FEMALE }
final Sex sex = Sex.valueOf("MALE");
2013/2014 Fundamentos de Programação 8
«enumeration»
Sex
MALE
FEMALE
sex
9. Disponibilizada automaticamente
Devolve cadeia de caracteres com nome exacto do
valor enumerado
Exemplo
public enum Sex { MALE, FEMALE }
final Sex sex = Sex.FEMALE;
final String sexName = sex.toString();
2013/2014 Fundamentos de Programação 9
Mas pode sobrepor-se
versão especializada!
«enumeration»
Sex
MALE
FEMALE
sex
sexName
“FEMALE”
10. Disponibilizada automaticamente
values() devolve uma array com todos os valores, por
ordem de declaração
Exemplo
public enum CardinalDirection {
NORTH,
SOUTH,
EAST,
WEST
}
for (CardinalDirection direction : CardinalDirection.values())
out.println(direction);
2013/2014 Fundamentos de Programação 10
«enumeration»
CardinalDirection
NORTH
EAST
SOUTH
WEST
direction
11. Evitar usar!
name() devolve sempre cadeia de caracteres
com nome exacto do valor enumerado
ordinal() devolve número de ordem do
valor enumerado
Por ordem de declaração
Primeiro valor tem ordem 0 (zero)
2013/2014 Fundamentos de Programação 11
12. Pode-se definir atributos e métodos
específicos
Pode-se definir construtores específicos
(desde que privados ou privados do pacote)
Cada valor pode ter sua própria sobreposição
de uma dada operação
2013/2014 Fundamentos de Programação 12
13. public enum CardinalDirection {
NORTH, SOUTH, EAST, WEST;
public String prettyName() {
return name().charAt(0) +
name().substring(1).toLowerCase();
}
}
…
out.println(CardinalDirection.NORTH.name());
out.println(CardinalDirection.SOUTH.prettyName());
2013/2014 Fundamentos de Programação 13
_NORTH
_
NORTH
South
_
15. switch (expressão) {
case valor1:
instruções1
break;
case valor2:
instruções2
break;
…
default:
instruções
break;
}
2013/2014 Fundamentos de Programação 15
16. Alternativa ao if-else
Quando fluxo de execução tem vários casos
de acordo com valor de expressão
Expressão de controlo e valores dos casos
Tipos primitivos inteiros (byte, short, int, etc.)
char
String
Enumerações
2013/2014 Fundamentos de Programação 16
Mas não
boolean!(obrigado
Nélio! )
17. public enum Command {
SAVE, LOAD, EXIT;
}
…
final Scanner inputScanner = new Scanner(System.in);
out.print("Introduza um comando: ");
final String commandText = inputScanner.nextLine();
final Command command = Command.valueOf(commandText);
switch(command) {
case SAVE:
…
break;
case LOAD:
…
break;
case EXIT:
…
break;
}
2013/2014 Fundamentos de Programação 17
Nos casos de um switch recorrendo a
uma enumeração, usa-se apenas os
valores enumerados, i.e., não se pode
preceder o valor do nome da
enumeração: Command.LOAD.
Sem o break, a execução continua,
passando para os casos seguintes!
19. 0 0 0 0
2013/2014 Fundamentos de Programação 19
1 1 1 1 0123456789101112131415 Suponhamos…
Com 4 bits
representamos 16
inteiros com valores
entre 0 e 15.
Com n bits
representamos 2n
inteiros com valores
entre 0 e 2n-1.
29. final int minimum = Integer.MIN_VALUE;
final int maximum = Integer.MAX_VALUE;
out.println(minimum);
out.println(maximum);
2013/2014 Fundamentos de Programação 29
_-2147483648
_
-2147483648
2147483647
_
Também estão
definidos os extremos
dos outros tipos
inteiros.
30. 2013/2014 Fundamentos de Programação 30
Tipo Bits Valor mínimo Valor máximo
byte 8 -128 127
short 16 -32768 32767
int 32 -2147483648 2147483647
long 64 -9223372036854775808 9223372036854775807
31. import java.math.BigInteger;
…
public class BigIntegerTester {
public static BigInteger factorialOf(BigInteger n) {
BigInteger factorial = BigInteger.valueOf(1);
while (n != BigInteger.ZERO) {
factorial = factorial.multiply(n);
n = n.subtract(BigInteger.ONE);
}
return factorial;
}
public static void main(final String[] arguments) {
out.println("Number of different deck shuffles: "
+ factorialOf(BigInteger.valueOf(52)));
}
}
2013/2014 Fundamentos de Programação 31
32. Enumerações em Java
Instrução de selecção switch
Limites dos tipos inteiros
Classe especial BigInteger
2013/2014 Fundamentos de Programação 32
33. Enumerações no JavaTutorial
Classe BigInteger na API do Java 7
2013/2014 Fundamentos de Programação 33
34. Enumerações
Instrução de selecção switch
Gama limitada dos tipos inteiros
2013/2014 Fundamentos de Programação 34