Exercícios para certificação Java 11
Criar projeto para simular uma compra de produtos. Serão criadas branches de solução para cada subseção a seguir.
- Criar uma classe para representar um Produto (Product) com as seguintes propriedades: identificador, nome e preço e seus respectivos métodos get e set;
- Criar uma classe para representar um compra (Shop) onde serão criados vários objetos de Produto.
- Em Produto:
- ajustar as parametros dos métodos set para final, evitando uma manipulação indevida ou acidental do valor passado como parâmetro;
- incluir valor constante para desconto do produto;
- criar método getDiscount para retornar o preço do produto após aplicado o desconto.
- Em Shop:
- criar um Produto e imprimir o preço e o valor após o desconto aplicado.
- Criar enumeração que represente a avaliação (Rating) de um produto;
- Usar unicodes "\u2605" para estrela cheia e "\u2606" para estrela vazia;
- Criar método get para obter a quantidade de estrelas que representa aquela avaliação;
- Criar uma propriedade avaliação (rating) que seja a avaliação do produto e o método get associado.
- Criar construtor de Product com todas as propriedades;
- Criar construtor de Product com todas as propriedades, exceto rating, e referenciando o construtor anterior;
- (Opcional) Alterar import's de enumerações para import static;
- Refatorar Shop para construir corretamente os objetos do tipo Product;
- (Opcional) Criar vários objetos Product e imprimir os valores de duas propriedades.
- Remover métodos set das propriedades de Product;
- Criar método applyRating para criar um objeto clone de Product com o novo rating passado por parâmetro;
- Refatorar Shop e criar um novo objeto de Produtor a partir de um já criado com um novo rating.
- Criar classe Drink extendendo de Product;
- Incluir propriedade data de valida (bestBefore) e o respectivo método get;
- Criar construtor com todas as propriedades;
- Criar classe Food extendendo de Product;
- Criar construtor com todas as propriedades;
- Criar objetos Food e Drink em Shop.
- Sobrescrever método toString em Product e Food;
- Refatorar Shop pra imprimir o objeto em si ao invés de construir uma String;
- Sobrescrever métodos equals e hashcode em Product baseado no id;
- Sobrescrever método getDiscount:
- Em Drink para retornar o desconto da super classe caso seja horário de happy-hour (17:30 - 18:30), caso contrário zero;
- Em Food para retornar o desconto da super classe caso esteja no dia da data de validade ou após, caso contrário zero;
- Sobrescrever método applyRating para criar clones dos objetos Food e Drink;
- (Opcional) Refatorar Shop e criar novos objetos Food e Drink e averiguar o uso do polimorfismo.
- Tornar Product uma classe abstrata;
- Tornar o método applyRating abstrato;
- Realizar as devidas correções;
- Criar método getBestBefore em Product e retornando data corrente;
- (Opcional) Criar mais objetos Drink e Product.
- Criar classe ProductManager que será responsável por criar instâncias de Product;
- Criar um método para criar um objeto Drink;
- Criar um método para criar um objeto Food.
- Modificar os construtores de Food, Product e Drink de public para default;
- Refatorar a criação de objetos em Shop.
- Criar uma interface genérica Avaliavel (Rateable);
- Criar constante para avaliação padrão (default rating) com valor não avaliado (NOT_RATED) da enumeração;
- Criar método applyRating tendo Rating como parâmetro retornando o tipo genérico;
- Criar método default - isto é, com implementação - getRating retornando o valor da avaliação padrão;
- Criar método estático convert para obter uma enumeração a partir do número de estrelas informado;
- Criar método default applyRating passando o número de estrelas de avaliação;
- (Opcional) Colocar a anotação FunctionalInterface;
- Fazer a classe Product implementar Rateable;
- (Opcional) Remover códigos desnecessários que já estão em Rateable.
- Criar classe Resenha (Review) com os atributos Review e comentários (comments) assim como seus respectivos getters e setters;
- Criar arquivo de propriedades para mensagens customizadas com nome resouces.properties com as seguintes mensagens:
- {0}, Price: {1}, Rating: {2}, Best Before: {3}
- Review: {0}\t{1}
- Not reviewed
- Refatorar ProductManager:
- Manter estado de Product e Review;
- Criar método para criação de Review;
- Criar propriedades para Locale, ResourceBundle, DateTimeFormatter e NumberFormat;
- Criar construtor com Locale como parametro e inicializar as propriedades acima;
- Criar construtor vazio reutilizando o construtor anterior e passando o Locale default;
- Criar método printProductReport para imprimir as mensagens customizadas;
- Criar vários objetos ProductManagers com diferentes Locale;
- Criar vários objetos Product e Review's;
- Imprimir os relatórios (report) de cada ProductManager.
- Modificar em ProductManager a propriedade review de objeto para array;
- Refatorar o método reviewProduct para incluir os reviews no array e com funcionalidade de autoscaling deste array;
- Refatorar para aplicar a média das avaliações como avaliação final em Product;
- Refatorar printProductReport já que é um array de Review's.
- Refatorar ProductManager:
- Remover as variáveis product e reviews;
- Criar uma variável products do tipo HashMap que irá conter o Product e seus Review's associados;
- Refatorar demais métodos impactados com esta mudança, mas mantendo as mesmas funcionalidades;
- Refatorar o printProductReport informando o produto que deseja ter o relatório.
- Alterar Review para implementar a interface Comparable;
- Implementar comparação considerando os ratings em ordem decrescente;
- Alterar printProductReport com os review's ordenados;
- Implementar método findProduct passando o id como parametro;
- Sobrecarregar os métodos reviewProduct e printProductReport passando o id de Product ao invés do objeto Product;
- Refatorar Shop passando os id's ao invés de objetos.
- Criar classe estática ResourceFormater dentro de ProductManager;
- Mover de ProductManager as propriedades dos tipos Locale, ResourceBundle, DateTimeFormatter e NumberFormat para esta nova classe;
- Criar um construtor semelhante ao de ProductManager;
- Criar métodos para formatar as mensagens que antes que eram geradas em ProductManager;
- Em ProductManager:
- Criar várias instâncias de classe de ResourceFormatter para vários Locale;
- Criar variável para ResourceFormatter;
- Criar método changeLocale permitindo alterar o objeto ResourceFormatter a partir do novo Locale informado;
- Criar método getSupportedLocales retornando os Locale's suportados;
- Recriar os construtores com parametros Locale e String e usando o método changeLocale para selecionar o ResourceFormatter adequado;
- O parametro String é tag de linguagem (languageTag) que tem como convenção ser formada por idioma e país, como "pt-BR";
- Refatorar método printProductReport para usar a classe nova;
- Refatorar Shop permitindo uso de unico ProductManager e modificando o Locale.
- Criar método printProducts que recebe como parâmetro Comparator;
- Usar o Comparator para ordenar a lista de produtos;
- Refatorar Shop para usar novo método de relatório customizado usando Lamba Expression.
- (Opcional) Aglutinar multiplos Comparator's para obter a ordenação desejada.
- Refatorar em ProductManager os métodos findProduct, reviewProduct, printProductReport e printProducts;
- (Opcional) Sobrecarregar método printProducts passando um Predicate além do Comparator para filtrar os produtos;
- (Opcional) Refatorar Shop usando o método acima.
- Criar método getDiscounts que irá agrupar os descontos por rating e somá-los;
- Refatorar Shop para usar o método criado.
- Criar exceção ProductManagerException;
- Refatorar findProduct para lançar a exceção acima caso o produto não seja encontrado;
- Tratar as excecões em reviewProduct e printProductReport;
- Criar uma variável de classe do tipo Logger para utilizar nos catches;
- (Opcional) Executar em Shop os método reviewProduct e printProductReport de ProductManager e verificar o comportamento.
- Criar novo arquivo de propriedades config.properties que desta vez não irá depender do Locale e com propriedades:
- product.data.format com valor {0},{1},{2},{3},{4},{5}
- review.data.format com valor {0},{1},{2}
- Criar variavel referenciando o novo ResourceBundle;
- Criar variaveis do tipo MessageFormat referenciando as mensagens;
- Criar o método parseReview tendo uma String como parâmetro, fazendo o parsing da mesma e reutilizando o outro método de reviewProduct;
- Realizar tratamento de exceção de ParseException exigido.
- Realizar tratamento de exceção em parseReview para NumberFormatException;
- Refatorar Shop e fazer vários review's via String;
- Criar funcionalidade semelhante para Product, isto é, criar método parseProduct com parametro String;
- Realizar tratamento de exceção considerando ParseException, NumberFormatException e DateTimeParseException;
- Refatorar Shop e criar vários produtos via String.
Os exercícios das seções 13 e 14 foram tirados da lista de exercícios, mas pode fazê-los se achar necessário.