Enums em Java: utilização e persistência

Documentos relacionados
Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação

4 Conceito de Herança

Paradigmas da Programação PPROG. Tipos Enumerados. Nelson Freire (ISEP DEI-PPROG 2013/14) 1/20

Linguagem de Programação III

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objetos

Esta categoria mais geral, à qual cada objeto pertence, denominamos de classe; IFSC/POO + JAVA - prof. Herval Daminelli

Orientação a Objetos e Java

RESULUÇÃO DOS EXERCÍCIOS E INSTRUÇÕES DE DECISÃO (if{} e else{}) Profº André Aparecido da Silva Disponível em:

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Classes e Objetos. Sintaxe de classe em Java

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

1 Introdução e Conceitos básicos

Interfaces POO. Prof. Marcio Delamaro

Array em Java. Figura 1 - Exemplo de um array de inteiros

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis

Definição de classes em Java (introdução) PCO / PPO Departamento de Informática Faculdade de Ciências da Universidade de Lisboa

PROCESSO SELETIVO PARA ESTÁGIO REMUNERADO NO TRIBUNAL DE CONTAS DO ESTADO DO MARANHÃO ENSINO SUPERIOR - INFORMÁTICA

Classes o Objetos. Classes, objetos, métodos e variáveis de instância

ALGORITMOS. Professor: Diego Oliveira. Aula 06 - Tipos Primitivos de Dados

Problema do Caminho Hamiltoniano

String. Demonstrar a utilização e manipulação com os métodos da classe String.

p Ja usamos, por diversas vezes, a classe String. Vimos o sistema de pacotes do Java e nunca precisamos dar um import nessa classe.

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

CONCEITOS BÁSICOS DE ORIENTAÇÃO A OBJETOS PROF. ME. HÉLIO ESPERIDIÃO

JPA Com Hibernate. Paulo Ricardo Lisboa de Almeida. 1 Universidade Positivo

Computação II Orientação a Objetos

Linguagem Java - Introdução

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Strings e Arrays POO

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu:

Tabelas Hash Endereçamento Direto

Estrutura de Dados Funções e Procedimentos

Aula 03 Introdução à Java. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Universidade Estadual de Santa Cruz

Unidade 8: Sobrecarga de Funções e Vetores e Matrizes (Arrays) Prof. Daniel Caetano

AULA 6 - ARRAYS. Array de 10 elementos

Aula 08 Encapsulamento. Disciplina: Programação Estruturada e Orientada a Objetos Prof. Bruno Gomes

Linguagem de Programação II Implementação

Java Variáveis e Controle Fluxo

Padrão de Projeto State

Framework Hibernate/JPA

Ambientação com a Sintaxe de Java: parte 1

Francisco Roeder. Orientador: Prof. Adilson Vahldick

Linguagem de Programação II Implementação

ALOCAÇÃO DINÂMICA DE MEMÓRIA

Computação II Orientação a Objetos

Genéricos. Profa. Thienne Johnson EACH/USP

Tipos, Literais, Operadores

Tipos, Literais, Operadores

1 TECNOLOGIA ELEMENTAR CAPÍTULO 3 E-books PCNA. Vol. 1 TECNOLOGIA ELEMENTAR CAPÍTULO 3 APRESENTANDO A LINGUAGEM C. Página 1

Laboratório de programação II

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan

INE 5612 Professor: Frank Siqueira. Leonardo Silva Jean Ercilio Thiago

5 Arrays. 5.1 Criando um array. 5.2 Inicializando arrays. c:\>java Array Janeiro tem 31 dias.

Tema da aula Introdução ao paradigma de programação: Orientado a Objetos

02. [Sebesta, 2000] Quais são as vantagens e as desvantagens dos tipos de dados decimais?

Estruturas de seleção. Prof.: Jesus

Curso de PHP. FATEC - Jundiaí TIPOS DE VARIÁVEIS

Lição 7 Array em Java

Diagramas Sintáticos

Algoritmos II prof. Daniel Oliveira

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

EXPRESSÕES BOOLEANAS. Ex: boolean b = false; // declara uma variável do tipo boolean e atribui false

Linguagem de Programação III

Linguagem Java. Introdução. Rosemary Silveira Filgueiras Melo

Testes com objetos mock. Curso de Tecnologia em Análise e Desenvolvimento de Sistemas Análise e Projeto Orientados a Objetos

Figura 28: Tela da aplicação Demo

Computação II Orientação a Objetos

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

JPQL (Java Persistence Query language)

Prof. A. G. Silva. 06 de setembro de Prof. A. G. Silva INE5603 Introdução à POO 06 de setembro de / 1

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Linguagem de Programação Visual

Unidade 7: Documentação de Código A Importância dos Comentários Prof. Daniel Caetano

Universidade Federal de Uberlândia Faculdade de Computação GGI030 Programação Orientada a Objetos 1o. Semestre de 2017 Prof.

Análise de Programação

Criando a Classe Pessoa Exemplo: Crie e modele uma classe que receba o nome, idade e peso de uma Pessoa. Ao final mostre os dados na tela.

Mapeando Relacionamentos Entre Classes com Anotações Hibernate Por: Raphaela Galhardo Fernandes Gleydson de Azevedo F. Lima

CA: Cidade: UF CARTÃO RESPOSTA QUESTÃO RESPOSTA QUESTÃO RESPOSTA A F B G C H D I

Manipulando a base de dados

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

AULA 02 DADOS PRIMITIVOS E EXERCÍCIOS

Desenvolva de qualquer sistema operacional para qualquer sistema operacional. Sem limites.

Linguagem de Programação III

HERANÇA NO BANCO DE DADOS COM ENTITY FRAMEWORK RESUMO

Comando de Seleção em Java

Orientação a Objetos AULA 09

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Singleton e Adapter. Professor: Nazareno Andrade (baseado no material de Hyggo Almeida e Jacques Sauvé)

Interfaces e Classes Abstratas

Algoritmos e Programação 2. Objetos e Classes em Java. Classes. Revisão. Definições de classes incluem (geralmente):

COMPORTAMENTOS - Observações

Escreva em Java a classe NumeroComplexo que represente um número complexo. A classe deverá ter os seguintes construtores:

UNIVERSIDADE PAULISTA - UNIP ICET INSTITUTO DE CIÊNCIAS EXATAS E TECNOLÓGIA

Atividade 08 - Utilizando Collections - List

Transcrição:

Enums em Java: utilização e persistência Jadson José dos Santos jadsonjs@gmail.com Nas primeiras versões da linguagem Java, a única forma que existia para se utilizar constantes enumeradas era através de tipos primitivos: public static final int STATUS_ALUNO_APROVADO = 0; public static final int STATUS_ALUNO_REPROVADO = 1; public static final int STATUS_ALUNO_EM_RECUPERACAO = 2; private int statusaluno = STATUS_ALUNO_APROVADO; Existem alguns problemas com essa abordagem. Abaixo, enumeram-se apenas três. 1- pode-se atribuir qualquer valor inteiro para a variável statusaluno, levando o aluno para o status inconsistente. 2 Não existe uma representação textual direta para as constantes, isto é, ao tentar imprimilas, será exibido um número que não tem significado para o usuário. 3 É preciso utilizar prefixos nas constantes para indicar a quem elas pertencem. Para solucionar esses problemas, a linguagem Java disponibilizou uma maneira mais poderosa de se definir constantes enumeradas, os enums. public enum StatusAluno { APROVADO, REPROVADO, EM_RECUPERACAO ; private StatusAluno status = StatusAluno.APROVADO ; Com a declaração acima, os três problema citados são solucionados. Somente um dos três status declarados podem ser atribuídos à variável status. Ao tenta-se imprimir o valor da variável, o nome declarado da constante será impresso, não o seu valor numérico. System.out.println(status); // imprime "APROVADO" Os namespace das constantes estão bem definidos dentro do enum StatusAluno. Mas enums são ainda mais poderosos, como as classes, eles podem conter construtores, declarações de outras variáveis e métodos. Para demonstrar o poder do uso dos enums, abaixo tem-se um exemplo da representação da situação de um usuário em um sistema de biblioteca. A princípio, utilizam-se tipos primitivos para modelar a situação dos usuários.

public class ConstantesBiblioteca { // Constantes da situação do Usuário. Situação quando o usuário não possui empréstimos em atraso e não está suspenso. public static final int SITUACAO_USUARIO_SEM_PENDENCIAS = 0; Situação quando o usuário possui empréstimos mas não estão atrasados. public static final int SITUACAO_USUARIO_POSSUI_EMPRESTIMOS_ATIVOS = 1; Situação quando o usuário possui empréstimos e eles estão atrasados. public static final int SITUACAO_USUARIO_POSSUI_EMPRESTIMOS_ATRASADOS = 2; Situação quando o usuário está suspenso. public static final int SITUACAO_USUARIO_ESTA_SUSPENSO = 3; Situação quando o usuário está multado. public static final int SITUACAO_USUARIO_ESTA_MULTADO = 4; Situação quando o usuário está com empréstimo atrasados. public static final int SITUACAO_USUARIO_ESTA_BLOQUEADO = 5; Vamos imaginar que queremos mostrar essas situações para o operador do sistema escolher em um relatório quais usuários da biblioteca, em uma determinada situação, ele deseja visualizar no momento. Precisamos criar uma listagem para o operador escolher a situação dos usuários que irão aparecer no relatório. Essa listagem precisa contém o valor a ser buscado e a descrição a ser mostradas ao operador. Uma das maneiras para disponibilizar essa listagem é criar uma entidade extra no sistema, que contenha a valor e a descrição de cada possível situação do usuário. public class SituacaoUsuarioBiblioteca { Retorna o valor inteiro que representa a situação. private int situacao = -1; Descreve a situação que o usuário se encontra private String descricaosituacao = null; * As possíveis situações de um usuário da biblioteca, preenchidas com descrições básicas. public static final Set<SituacaoUsuarioBiblioteca> POSSIVEIS_SITUACAO_DO_USUARIO = new HashSet<SituacaoUsuarioBiblioteca>( Arrays.asList(new SituacaoUsuarioBiblioteca[] { ConstantesBiblioteca.SITUACAO_USUARIO_SEM_PENDENCIAS, "Sem Pendências"), ConstantesBiblioteca.SITUACAO_USUARIO_ESTA_SUSPENSO, "Suspenso"), ConstantesBiblioteca.SITUACAO_USUARIO_ESTA_MULTADO, "Multado"), ConstantesBiblioteca.SITUACAO_USUARIO_POSSUI_EMPRESTIMOS_ATIVOS, "Possui Empréstimos Ativos"), ConstantesBiblioteca.SITUACAO_USUARIO_POSSUI_EMPRESTIMOS_ATRASADOS, "Possui Empréstimos Atrasados"),

ConstantesBiblioteca.SITUACAO_USUARIO_ESTA_BLOQUEADO, "Bloqueado") ) ); Utilizando-se um enum para modelar a situação do usuário, teríamos algo como: public enum SituacaoUsuarioBiblioteca { SEM_PENDENCIA(1, "Usuário Sem Pendências"), POSSUI_EMPRESTIMOS_ATIVOS(2, "Usuário Possui Empréstimos Ativos"), ESTA_SUSPENSO(3, "Usuário está Suspenso"), ESTA_MULTADO(4, "Usuário está Multado"), POSSUI_EMPRESTIMOS_ATRASADOS(5, "Usuário Possui Empréstimos Atrasados"), ESTA_BLOQUEADO(6, "Usuário está Bloqueado"); * O valor que representa a situação private int valor; * A descrição da situação do usuário private String descricao; private SituacaoUsuarioBiblioteca(int valor, String descricaoresumida){ this.valor = valor; this.descricao = descricao; public boolean issituacaoimpedeemprestimos(){ if(this.equals(esta_suspenso) this.equals(esta_multado) this.equals(possui_emprestimos_atrasados) this.equals(esta_bloqueado) ) return true; return false; * Usado nos relatórios public static final Set<SituacaoUsuarioBiblioteca> POSSIVEIS_SITUACAO_DO_USUARIO = new HashSet<SituacaoUsuarioBiblioteca>( Arrays.asList( SituacaoUsuarioBiblioteca.SEM_PENDENCIA, SituacaoUsuarioBiblioteca.ESTA_SUSPENSO, SituacaoUsuarioBiblioteca.ESTA_MULTADO, SituacaoUsuarioBiblioteca.POSSUI_EMPRESTIMOS_ATIVOS, SituacaoUsuarioBiblioteca.POSSUI_EMPRESTIMOS_ATRASADOS SituacaoUsuarioBiblioteca.BLOQUEADO ) ); A variável estática POSSIVEIS_SITUACAO_DO_USUARIO do próprio enum já retorna a valor e a descrição das possíveis situações do usuário para serem utilizadas em um filtro de um relatório como era desejado, sem a necessidade de se criar uma nova entidade para representar isso. O que

deixa nosso código mais enxuto e legível. Outro exemplo das vantagens na modelagem da situação do usuário com a utilização de enums, é de que em vez de temos que fazer comparações de inteiros como mostrado abaixo: int situacao = ConstantesBiblioteca.SITUACAO_USUARIO_ESTA_MULTADO; if(situacao == ConstantesBiblioteca.SITUACAO_USUARIO_ESTA_SUSPENSO situacao == ConstantesBiblioteca.SITUACAO_USUARIO_ESTA_MULTADO situacao == ConstantesBiblioteca.SITUACAO_USUARIO_POSSUI_EMPRESTIMOS_ATRASADOS situacao == ConstantesBiblioteca.SITUACAO_USUARIO_ESTA_BLOQUEADO ){ // mostra mensagem e não deixa o usuário realizar novos empréstimos A própria constante do enum pode disponibilizar um método que mostre se ela é uma situação que permite ao usuário realizar empréstimos na biblioteca, por meio do método issituacaoimpedeemprestimos(). Assim, o código de verificação se resumira a: SituacaoUsuarioBiblioteca situacao = SituacaoUsuarioBiblioteca.ESTA_MULTADO; if(situacao.issituacaoimpedeemprestimos()){ // mostra mensagem e não deixa o usuário realizar novos empréstimos A simplificação do código também poderia ser utilizado em páginas web: <td> </td> <c:if test="${not situacao.situacaoimpedeemprestimos"> <h:outputtext value="#{situacao.descricao" style="color:green;"/> </c:if> <c:if test="${ situacao.situacaoimpedeemprestimos"> <h:outputtext value="#{situacao.descricao" style="color:red;"/> </c:if> Um problema encontrado com a utilização de enums é correlação a sua persistência. Como os dados das constantes enumeradas são definidos pelos usuários, não há como os frameworks 4 de mapeamento objeto relacional saberem de antemão como persisti-los. É preciso utilizar soluções específicas para a implementação JPA utilizada, como por exemplo, a interface UserType do Hibernate 2. Contudo, para os casos mais comuns, onde o valor das constantes enumeradas representa números inteiros, e apenas esse valor precisa ser persistido, é possível utilizar o mapeamento ORDINAL 5 ; esse mapeamento utiliza como valor do enum a ser persistido o valor sequencial da ordem em que as constantes dos enum são declaradas. Por exemplo, verificaremos o código da entidade ReservaMaterialBiblioteca, que represente uma reserva de um material feita em um sistema de

biblioteca. public class ReservaMaterialBiblioteca { public enum StatusReserva { SOLICITADA(0), EM_ESPERA(1), CANCELADA(2), CANCELADA_MANUALMENTE(3), CONCRETIZADA(4); private int valor; private StatusReserva(int valor){ this.valor = valor; Método chamado para obter o valor do enum nas consultas. @Override public String tostring() { return String.valueOf(valor); * O status da reserva @Enumerated(EnumType.ORDINAL) @Column(name="status", nullable=false) private StatusReserva status = StatusReserva.SOLICITADA; * Retorna os status que são considerados ativos. * * @return public static StatusReserva[] getreservasativas(){ return new StatusReserva[]{StatusReserva.SOLICITADA, StatusReserva.EM_ESPERA; Uma ReservaMaterialBiblioteca tem a declaração de um enum público 1 StatusReserva que possui uma variável valor que representa o valor da constantes do enum, um construtor que recebe o valor da constante e um método tostring() que retorna a representação textual do valor da constante do enum. A classe ReservaMaterialBiblioteca contém também a variável status do tipo StatusReserva que é mapeada com a anotação @Enumerated com o tipo EnumType.ORDINAL. Assim no momento de realizar a persistência, o framework de mapeamento objeto relacional vai utilizar o valor ordinal das constantes (começado do valor zero). O variável valor do enum deve conter o mesmo valor do valor ordinal das constantes como observar-se na declaração das constantes do enum StatusReserva cuja representação textual é 1 É necessário ser público para o JPA conseguir acessá-lo.

retornada no método tostring() para ser utilizado nas consultas. Ao persistir uma reserva de material, o valor ordinal da constante enumerada para o status da reserva será salvo 2. A recuperação desse valor também é automática, um StatusReserva com o valor ordinal será retornado. Um exemplo de como realizar consultas está descrito no método findallreservasativas() abaixo. * <p>retorna a listagem de todas as reservas ativas. </p> * * @param datasolicitacao * @param idtitulo * @return public List<ReservaMaterialBiblioteca> findallreservasativas(int idtitulo, Date datasolicitacao){ final String projecao= " r.id, r.dataprevisaoretiradamaterial "; StringBuilder hql = new StringBuilder(" SELECT "+projecao); hql.append(" FROM ReservaMaterialBiblioteca r "); hql.append(" WHERE r.tituloreservado.id = :idtitulo "); hql.append(" AND r.status in "+HibernateUtils.gerarStringIn( ReservaMaterialBiblioteca.getReservasAtivas() ) ); hql.append(" AND r.datasolicitacao > :datasolicitacao"); hql.append(" ORDER BY r.datasolicitacao, r.id "); Query q = getsession().createquery(hql.tostring()); q.setinteger("idtitulo", idtitulo); q.settimestamp("datasolicitacao", datasolicitacao); @SuppressWarnings("unchecked") List<Object[]> linhas = q.list(); return new ArrayList<ReservaMaterialBiblioteca> ( HibernateUtils.parseTo(linhas, projecao, ReservaMaterialBiblioteca.class, "r")); Esse método faz uso do método estático getreservasativas() que retorna um array de todas as reservas que são consideradas ativas no sistema. O valor utilizado na consulta gerada, será o valor da representação textual do enum retornado pelo método tostring(), que é a representação textual da variável valor do enum, que por sua vez, contém o mesmo valor ordinal persistido. Logo, a consulta acima retornará as reservas com status desejado. 2 No banco, a coluna status precisa ser de um tipo que aceite valores inteiros.

Referências 1. http://download.oracle.com/javase/1.5.0/docs/guide/language/enums.html 2. http://www.hibernate.org/265.html 3. http://www.guj.com.br/java/144147-persistencia-de-enum-enumtypeordinal 4. http://www.cs.wustl.edu/~schmidt/cacm-frameworks.html 5. http://www.java2s.com/code/java/jpa/enumeratedenumtypeordinal.htm