semana 11: enumerações, limites de tipos numéricos (gama e precisão)
DESCRIPTION
Apresentação da semana 11 da unidade curricular de Introdução à Programação do DCTI do ISCTE-IUL. Alterações de Manuel Menezes de Sequeira sobre versão original por vários autores do DCTI, incluindo Luís Nunes e André Santos.TRANSCRIPT
Aula 11
EnumeraçõesGama limitada dos tipos numéricosPrecisão limitada dos tipos de vírgula flutuante
Introdução à Programação - DCTI - ISCTE-IUL 2
Da aula anterior…
Encapsulação
Cópia de instâncias
Igualdade de instâncias
2010/2011
Como representar…
Sexo boolean? int? String?
Dias da semana int? String?
Meses do ano
Pontos cardinais
Estado civil2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 3
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!
Introdução à Programação - DCTI - ISCTE-IUL 4
Enumerações: o que são?
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
2010/2011
!!??
Enumerações: exemplos simplesTipo de valores a representar Java
Sexo (masculino e feminino) enum Sex { MALE, FEMALE }
Dias da semana (de segunda-feira a domingo)
enum WeekDay { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}
Pontos cardeais (Norte, Sul, Este e Oeste)
enum CardinalDirection { NORTH, SOUTH, EAST, WEST}
2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 5
Enumerações: exemplo de utilização
public static void main(final String[] arguments) { WeekDay monday = WeekDay.MONDAY; WeekDay someDay = WeekDay.FRIDAY; out.println("Monday is " + monday + "."); someDay = WeekDay.valueOf("Friday"); someDay = WeekDay.valueOf("FRIDAY"); if (someDay == WeekDay.SUNDAY) out.println("Some day is Sunday.");
out.println("Some day is " + someDay + ".");}
2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 6
Introdução à Programação - DCTI - ISCTE-IUL 7
Enumerações: método valueOf
Disponibilizado automaticamente
Devolve valor enumerado dada cadeia de caracteres com o seu nome exacto
Exemplo
public enum Sex { MALE, FEMALE }
Sex sex = Sex.valueOf("MALE");
2010/2011
«enumeration»Sex
MALE
FEMALE
sex
Introdução à Programação - DCTI - ISCTE-IUL 8
Enumerações: operação toString
Disponibilizada automaticamente
Devolve cadeia de caracteres com nome exacto do valor enumerado
Exemplo
public enum Sex { MALE, FEMALE }
Sex sex = Sex.FEMALE;String sexName = sex.toString();
2010/2011
Mas pode sobrepor-se versão
especializada!
«enumeration»Sex
MALE
FEMALE
sex
sexName
“FEMALE”
Introdução à Programação - DCTI - ISCTE-IUL 9
Enumerações: operação values
Disponibilizada automaticamente
values() devolve uma matriz 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);
2010/2011
«enumeration»CardinalDirection
NORTH
EAST
SOUTH
WEST
direction
Enumerações: operações técnicas
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)2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 10
Enumerações: vantagens adicionais
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
2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 11
BlueJ
Chemical ElementOperações e atributos própriosSwitch longNameAtomicNumberAtomicMassH He Li Be
2010/2011 Introdução à Programação - DCTI - ISCTE-IUL 12
Introdução à Programação - DCTI - ISCTE-IUL 13
Instrução de selecção switch
Alternativa ao if-else Adequada quando as diferentes
alternativas de execução são determinadas pelo valor de determinada variável▪ A variável pode ter um dos tipos primitivos
numéricos para representar inteiros (byte, short, int) , char, ou ser de um tipo enumerado
2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 14
Exemplo (opções de menu / switch)
2010/2011
public enum Command { SAVE, LOAD, EXIT;}
...Scanner scanner = new Scanner(System.in);System.out.println(“Introduza uma comando:”);String line = scanner.nextLine();Command command = Command.valueOf(line);switch(command) { case SAVE: // gravar... break; case LOAD: // carregar... break; case EXIT: // sair... break;}
Introdução à Programação - DCTI - ISCTE-IUL 15
Exemplo (direcção)
2010/2011
public enum Direction { NORTH, SOUTH, EAST, WEST; public String prettyName() { return name().charAt(0) + name().substring(1).toLowerCase(); }} Objectos do tipo
Direction
SOUTH
NORTH
EAST
WEST
String s1 = Direction.NORTH.name();System.out.println(s1);String s2 = Direction.SOUTH.prettyName();System.out.println(s2);
> NORTH> South
Introdução à Programação - DCTI - ISCTE-IUL 16
Limites nos tipos primitivos
Uma variável de tipo primitivo tem um intervalo de valores possíveis, relacionado com o número de bits que é utilizado para representar p.e. no tipo int é [-2147483648,
2147483647]
2010/2011
int min = Integer.MIN_VALUE;int max = Integer.MAX_VALUE;
2147483647max
-2147483648min
Introdução à Programação - DCTI - ISCTE-IUL 17
Rotação entre valor extremos
Ao efectuar uma operação aritmética cujo resultado ultrapasse o limite, é efectuada uma rotação do limite superior para o inferior, ou vice-versa
2010/2011
int max = Integer.MAX_VALUE;max++;
2147483647max -2147483648++
Introdução à Programação - DCTI - ISCTE-IUL 18
double: problemas de precisão
Ao efectuar operações aritméticas utilizando o tipo primitivo double (ou float) podem ocorrer problemas de precisão IEEE Standard for Floating-Point Arithmet
ic (IEEE 754)
2010/2011
double a = 3.4;double b = 0.2;double c = a - b;System.out.println(c);
> 3.1999999999999997 ?
Introdução à Programação - DCTI - ISCTE-IUL 19
Classe BigDecimal
Classe que permite a manipulação de números decimais, garantindo que não ocorrem erros de precisão
Deve ser utilizada sempre que a precisão é crucial (p.e. cálculo financeiro)
2010/2011
BigDecimal a = new BigDecimal(3.4);BigDecimal b = new BigDecimal(0.2);BigDecimal c = a.subtract(b, MathContext.DECIMAL32);double d = c.doubleValue();System.out.println(d);
> 3.2
Introdução à Programação - DCTI - ISCTE-IUL 20
A reter
Enumerados em JavaLimites dos tipos primitivosProblemas de precisão ao utilizar double Classe BigDecimal
2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 21
A ler...
http://download.oracle.com/javase/tutorial/java/javaOO/enum.html
IEEE Standard for Floating-Point Arithmetic (IEEE 754)
http://download.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html
2010/2011
Introdução à Programação - DCTI - ISCTE-IUL 22
Sumário
EnumeraçõesGama limitada dos tipos numéricosPrecisão limitada dos tipos de vírgula
flutuante
2010/2011