Você está na página 1de 63

Java

Primeiros vamos ver alguns conceitos básicos de programação como por exemplo algoritmos
que são passos a serem seguidos para resolução de um problema e o programa

Linguagem de programação e um conjuntos de regras léxicas e sintática para escrever


programas

Linguagens de programação compilada e interpretada:

A programação começa no código fonte com o código fonte pronto o compilador analisa de
forma léxica e sintática transformando em código objeto logo depois e feito a bulid do código
para esse ser executado. Essa e forma que uma linguagem compilada funciona.

Agora e linguagem interpretada que faz a analise léxica e sintática, geração do código sobre
demanda

Temos também a abordagem hibrida que faz uma pre compilação fazendo um bytecode que e
interpretado sob demanda por uma maquina virtual

Cada uma tem suas vantagens na compilada temos mais auxilio da ide e a velocidade do
programa e mais rápido, já na com a interpretada vai ter flexibilidade na manutenção o e o
código fonte não precisa ser recompilado para rodar em outras maquinas

Na linguagem compilada o código executável so roda pra uma maquina

Na interpretada e preciso muda o interpretador

Na forma hibrida tem uma maquina virtual especifica para sistema que esta sendo usado

O que e java?

Uma linguagem de programação com regras sintáticas, mas também e uma plataforma de
desenvolvimento com bibliotecas(api) e ambientes de execução

Jvm- java Virtual machine

Maquina virtual necessária para executar o sitema em java

Estrutura do java:

O java tem class todo o código nas class. Um package e um conjuntos de class e temos o
módulos que e um conjuntos de de package relacionados logo depois temos a aplicação que e
um conjuntos de módulos relacionados

Java também e uma linguagem de tipagem estática

a com seu tipos sendo:


Para declara variável aqui temos a mesma regras só que começa com letra minúscula e no
resto do nome se usa camel case

Obs: escrita e a saída de dados, processamento, e a leitura quando os dados entram

como fazer a entrada de dados estar na Aula2 quando o next e usado toda a variável que for
uma string terá que ser especificada logo depois do next como nextInt, nextDouble...

Calculo aritméticos

Feitos com pow pra indicar potencia, sqr e a raiz e abs o absoluto:

Math.sqrt(x);

g = Math.pow(a,3.0);

h = Math.abs(c);

lembrando que e possível coloca coisa a mais dentro do calculo como

g = (Math.pow(a,3.0)) / 4;

para aprender mais equações e so pesquisar java.lang.Math

Restrições para nomes de variáveis

• Não pode começar com dígito: use uma letra ou _

• Não usar acentos ou til

• Não pode ter espaço em branco

• Sugestão: use nomes que tenham um significado

Errado:

int 5minutes;

int salário;
int salario do funcionario;

Correto:

int _5minutes;

int salario;

int salarioDoFuncionario;

Convenções

• camel Case: lastName

• pacotes

• atributos

• métodos

• variáveis e parâmetros

• Pascal Case: ProductService

• classes

Operadores bitwise:
Utilizados para programação de mais baixo nível fazendo a leitura de bit a
bit do dado

Considerando o 1 como verdadeiro e 0 como faço e possível também


declara uma variável direto do binário como int mask = 0b000100101010;
Funções para string:
• Formatar: toLowerCase(), toUpperCase(), trim()

• Recortar: substring(inicio), substring(inicio, fim)

• Substituir: Replace(char, char), Replace(string, string)

• Buscar: IndexOf, LastIndexOf

• str.Split(" ")

Comentarios no java são feitos com // para linha e para bloco se usa /* */

Funções:

Primeira regra de uma função ela teve estar fora do main, mas dentro do public Class
Documento

Segunda regra sempre que elas que a função não retorna nada e necessário usar void

” public static void”


Classe

• É um tipo estruturado que pode conter (membros):

• Atributos (dados / campos)

• Métodos (funções / operações)

• A classe também pode prover muitos outros recursos, tais como:

• Construtores

• Sobrecarga

• Encapsulamento

• Herança

• Polimorfismo

• Exemplos:

• Entidades: Produto, Cliente, Triangulo

• Serviços: ProdutoService, ClienteService, EmailService, StorageService

• Controladores: ProdutoController, ClienteController

• Utilitários: Calculadora, Compactador

• Outros (views, repositórios, gerenciadores, etc.)

A forma como a memória funciona quando e colocado Class em no jogo mudo porque
geralmente variáveis são armazenadas na memória stack, quando e possível colocar essas
variáveis em uma Class ela são armazenadas na heap fazendo o endereço de memoria ir para o
stack.
Obs: quando se estar manipulando POO e necessário istanciar esse objeto. E sim é bem
diferente do python:

Aqui tem uma pequena estrutura de como funciona uma Class

Discussão
• Toda classe em Java é uma subclasse da classe Object

• Object possui os seguintes métodos:

• getClass- retorna o tipo do objeto

• equals - compara se o objeto é igual a outro

• hashCode - retorna um código hash do objeto

• toString - converte o objeto para string

Membros estáticos
• Também chamados membros de classe

• Em oposição a membros e instância

• São membros que fazem sentido independentemente de objetos. Não

precisam de objeto para serem chamados. São chamados a partir do

próprio nome da classe.

• Aplicações comuns:
• Classes utilitárias

• Declaração de constantes

• Uma classe que possui somente membros estáticos, pode ser uma classe

estática também. Esta classe não poderá ser instanciada.

Métodos estáticos vão ter um valor(resultado) independe do objeto que for chamado. Outra
características e não e possível chamar um método não static o de uma mesma class que seja
static. Quando declara variáveis static o nome da mesma tem que ser todo em másculo e
métodos statics não precisam ser estanciados

Construtor
• É uma operação especial da classe, que executa no momento da

instanciação do objeto

• Usos comuns:

• Iniciar valores dos atributos

• Permitir ou obrigar que o objeto receba dados / dependências no momento de sua

instanciação (injeção de dependência)

• Se um construtor customizado não for especificado, a classe disponibiliza o

construtor padrão:

Product p = new Product();

• É possível especificar mais de um construtor na mesma classe (sobrecarga)

Ajuda a definir parâmetros obrigatórios para a class ,apenas tenha cuidado na hora de
instanciar a class já que e necessário ter os parâmetros antes de fazer a própria instancia
Sobrecarga
• É um recurso que uma classe possui de oferecer mais de uma operação com o mesmo
nome, porém com diferentes listas de parâmetros.

Assim o class pode receber nenhum parâmetro, os três ou apenas o name e price

Métodos de acesso

Gettter e setter:
Como já visto o getter serve para proteger o nome da variável e captura a variável o setter faz
mudança nessa variável pra gera tudo automaticamente e só ir no source com o botão direito

Obs: getter e setter são implementados depois dos construtores e claro que eu não preciso
fala que so possível fazer essas implementações em variáveis private, você não seria burro de
fazer isso em uma public ne?

Para ver mais e ler exemplos getter_and_setter

Modificadores de acesso:
Encapsulamento
Usados para proteger as class Sendo o
public: tudo pode ter acesso a ele menos em um modulo em que o package dele não
foi exportado
private: não pode ser acesso por nada apenas pela própria class
nada: int b; pode ser usado em diferentes class no mesmo package
protected: pode ser usado em diferentes class no mesmo package em diferentes
package em um class que herda a que ele esta

Classes são tipos referência


Variáveis cujo tipo são classes não devem ser entendidas como caixas, mas sim

“tentáculos” (ponteiros) para caixas. Logo dados de tipo referência iram apenas guarda uma
imagem no Stack para apontar na memória heap onde realmente esta o dado

Como e mostrado no exemplo quando p2 =p1 ele ira somente apontar não guardando o dado
Tipos valor:
Esse iram realmente guarda os dados em uma caixa(variável) para serem utilizados
sem precisa apontar para nada, lembrado que todos os dados primitivos são tipo
valor.

Valores padrão
• Quando alocamos (new) qualquer tipo estruturado (classe ou array),
são atribuídos valores padrão aos seus elementos
• números: 0
• boolean: false
• char: caractere código 0
• objeto: null

Garbage collector
• É um processo que automatiza o gerenciamento de memória de um
programa em execução
• O garbage collector monitora os objetos alocados dinamicamente
pelo programa (no heap), desalocando aqueles que não estão mais

sendo utilizados.
Desalocação por escopo
Esse assunto já foi visto em python quando variáveis são declarada no escopo de if por
exemplo elas iram ser utilizadas iram existir lá, mas quando esse bloco de código acaba
as variáveis são descartadas da memoria
Como nesse exemplo onde a variável foi criada e logo descartada
Vetores
• Em programação, "vetor" é o nome dado a arranjos unidimensionais
• Arranjo (array) é uma estrutura de dados:
• Homogênea (dados do mesmo tipo)
• Ordenada (elementos acessados por meio de posições)
• Alocada de uma vez só, em um bloco contíguo de memória
• Vantagens:
• Acesso imediato aos elementos pela sua posição
• Desvantagens:
• Tamanho fixo
• Dificuldade para se realizar inserções e deleções
Array também pode apontar para dados de referencia guardando um objeto em cada
índice
Expressão condicional ternária

int numero = 10;

String mensagem = (numero % 2 == 0) ? "O número é par" : "O número é ímpar";

Boxing, unboxing e wrapper classes:


Boxing quando um dado do tipo valor e transformado em um dado de referencia

Já que todas as classes herdam da object e possível realizar isso

Unboxing e o contrario transformando

Para fazer esse processo naturalmente sem o uso do chace temos a wrapper classes São
classes equivalentes aos tipos primitivos

• Boxing e unboxing é natural na linguagem

• Uso comum: campos de entidades em sistemas de informação (IMPORTANTE!)

• Pois tipos referência (classes) aceitam valor null e usufruem dos recursos OO

Por exemplo atributos usado a wrapper class podem ter valor null fazendo o usuário definir ou
não a variável
Obs: os comandos fazem a conversão dos tipos

double price = Double.parseDouble(listProduct[1]);

int quantity = Integer.parseInt(listProduct[2]);

Laço "for each"

Lista
• Lista é uma estrutura de dados:

• Homogênea (dados do mesmo tipo)


• Ordenada (elementos acessados por meio de posições)

• Inicia vazia, e seus elementos são alocados sob demanda

• Cada elemento ocupa um "nó" (ou nodo) da lista

• Tipo (interface): List

• Classes que implementam: ArrayList, LinkedList, etc.

• Vantagens:

• Tamanho variável

• Facilidade para se realizar inserções e deleções

• Desvantagens:

• Acesso sequencial aos elementos *

• Tamanho da lista: size()

• Obter o elemento de uma posição: get(position)

• Inserir elemento na lista: add(obj), add(int, obj)

• Remover elementos da lista: remove(obj), remove(int), removeIf(Predicate)

• Encontrar posição de elemento: indexOf(obj), lastIndexOf(obj)

• Filtrar lista com base em predicado:

List<Integer> result = list.stream().filter(x -> x > 4).collect(Collectors.toList());

• Encontrar primeira ocorrência com base em predicado:

Integer result = list.stream().filter(x -> x > 4).findFirst().orElse(null);

Matrizes
• Em programação, "matriz" é o nome dado a arranjos bidimensionais

• Atenção: "vetor de vetores"

• Arranjo (array) é uma estrutura de dados:

• Homogênea (dados do mesmo tipo)

• Ordenada (elementos acessados por meio de posições)

• Alocada de uma vez só, em um bloco contíguo de memória

• Vantagens:

• Acesso imediato aos elementos pela sua posição

• Desvantagens:

• Tamanho fixo

• Dificuldade para se realizar inserções e deleções


1. CamelCase:
 PascalCase (UpperCamelCase): "NomeCompleto"
 camelCase (lowerCamelCase): "nomeCompleto"
2. Snake_case:
 "nome_completo"
3. kebab-case:
 "nome-completo"
4. Screaming_Snake_Case:
 "NOME_COMPLETO"
5. Dashed-Case:
 "nome-completo"

Conceitos importantes
• Data-[hora] local:

ano-mês-dia-[hora] sem fuso horário

[hora] opcional

• Data-hora global:

ano-mês-dia-hora com fuso horário

• Duração:

tempo decorrido entre duas data-horas


Quando usar?
• Data-[hora] local:

Quando o momento exato não interessa a pessoas de outro fuso horário.

Uso comum: sistemas de região única, Excel.

Data de nascimento: "15/06/2001"

Data-hora da venda: "13/08/2022 às 15:32" (presumindo não interessar fuso horário)

• Data-hora global:

Quando o momento exato interessa a pessoas de outro fuso horário.

Uso comum: sistemas multi-região, web.

Quando será o sorteio? "21/08/2022 às 20h (horário de São Paulo)"

Quando o comentário foi postado? "há 17 minutos"

Quando foi realizada a venda? "13/08/2022 às 15:32 (horário de São Paulo)"

Início e fim do evento? "21/08/2022 às 14h até 16h (horário de São Paulo)"

Timezone (fuso horário)


• GMT - Greenwich Mean Time

• Horário de Londres

• Horário do padrão UTC - Coordinated Universal Time

• Também chamado de "Z" time, ou Zulu time

• Outros fuso horários são relativos ao GMT/UTC:


• São Paulo: GMT-3

• Manaus: GMT-4

• Portugal: GMT+1

• Muitas linguagens/tecnologias usam nomes para as timezones:

• "US/Pacific"

• "America/Sao_Paulo"

• etc.

Padrão ISO 8601


Data-[hora] local:

2022-07-21

2022-07-21T14:52

2022-07-22T14:52:09

2022-07-22T14:52:09.4073

Data-hora global:

2022-07-23T14:52:09Z

2022-07-23T14:52:09.254935Z

2022-07-23T14:52:09-03:00

Operações importantes com data-hora


• Instanciação

• (agora) ➞ Data-hora

• Texto ISO 8601 ➞ Data-hora

• Texto formato customizado ➞ Data-hora

• dia, mês, ano, [horário] ➞ Data-hora local • Formatação

• Data-hora ➞ Texto ISO 8601

• Data-hora ➞ Texto formato customizado

• Converter data-hora global para local

• Data-hora global, timezone (sistema local) ➞Data-hora local

• Obter dados de uma data-hora local • Data-hora local ➞ dia, mês, ano, horário

• Cálculos com data-hora

• Data-hora +/- tempo ➞ Data-hora


• Data-hora 1, Data-hora 2 ➞ Duração

Principais tipos Java (versão 8+) • Data-hora local


LocalDate

LocalDateTime

• Data-hora global

Instant

• Duração

Duration

• Outros

ZoneId

ChronoUnit

Enumerações
É um tipo especial que serve para especificar de forma literal um

conjunto de constantes relacionadas, usada para definir valores que são constantes

por exemplo estágios de uma entrega

o programa sempre vai imprimir o enum como string. Para converter uma string em enum

Conversão de String para enum OrderStatus os1 = OrderStatus.DELIVERED;

OrderStatus os2 = OrderStatus.valueOf("DELIVERED");

Composição

• É um tipo de associação que permite que um objeto contenha outro

• Relação "tem-um" ou "tem-vários"

• Vantagens

• Organização: divisão de responsabilidades

• Coesão

• Flexibilidade

• Reuso

• Nota: embora o símbolo UML para composição (todo-parte) seja o diamante preto, neste
contexto estamos chamando de composição qualquer associação

tipo "tem-um" e "tem-vários".


Composição
• É um tipo de associação que permite que um objeto contenha outro
• Relação "tem-um" ou "tem-vários"
• Vantagens
• Organização: divisão de responsabilidades
• Coesão
• Flexibilidade
• Reuso
• Nota: embora o símbolo UML para composição (todo-parte) seja o diamante preto,
neste contexto estamos chamando de composição qualquer associação
tipo "tem-um" e "tem-vários".

Por exemplo nesse código onde temos duas associações, com uma sendo criado uma
lista na própria class sem sendo necessário ser colocada no construtor, pois já esta
instanciada.
StringBuilder
Usado para ajuda na formatação do toString adicionando e configurando como esse
atributos/texto iram ser mostrados um exemplo
Relações entre classes
Associação: e uma relação que um elemento com outro do tipo fraca que um não depende do
outro

Agregação: uma associação do tipo fraca um elemento conecta a outro, mas um elemento
existe sem outro um sendo necessário de outro para realiza certa tarefa.

Dessa foram uma agregação geralmente envolve 1 para muitos

Composição: e uma forma agregação de forma mais específica nesse termo tudo vai ser mais
ou menos iguala a agregação, só que aqui uma depende da outra pra existir

Herança
• É um tipo de associação que permite que uma classe herde todos dados e comportamentos
de outra

• Definições importantes

• Vantagens

• Reuso

• Polimorfismo

• Sintaxe

• class A extends B

Herança uma relação de um para um em que a classe que a super class vai doar todos seu
atributos e comportamento para a sub class
Também temos o conceito de generalização onde a class mais comum a superclass, e a
subclasse vai ser usada para trabalhos mais específicos.

Herança e uma associação entre class e não um relação entre objetos

Checklist

• Upcasting quando fazemos um objeto mais especifico se passa por um mais generico

• Casting da subclasse para superclasse

• Uso comum: polimorfismo

• Downcasting

• Casting da superclasse para subclasse

• Palavra instanceof

• Uso comum: métodos que recebem parâmetros genéricos (ex: Equals)

Quando e feito um downcasting o compilador so consegue verifica se a superclass estar


instanciando a sub class certa na hora, então e responsabilidade do programador verificar isso
utilizado a instaceof.
Sobreposição ou sobrescrita
• É a implementação de um método de uma superclasse na subclasse

• É fortemente recomendável usar a

anotação @Override em um método

sobrescrito

• Facilita a leitura e compreensão do

código

• Avisamos ao compilador (boa prática)

Quando e código e rescrito para ser utilizado na subclasse, usado praticamente em dois
lugares em métodos e construtores

No numero um temos a marcação @Overriede, com ela marcamos o código para ser mais
legível e avisa ao compilador/ide que ali temos um sobreposição

Logo abaixo estar a assinatura do código que tem que ser igual para temos esse efeito

Palavra super

É possível chamar a implementação da superclasse usando a palavra super.

@Override

public void withdraw(double amount) {

super.withdraw(amount);

balance -= 2.0;
Recordando: usando super em construtores

Classes e métodos final


• Palavra chave: final

• Classe: evita que a classe seja herdada

public final class SavingsAccount {

• Método: evita que o método sob seja sobreposto

Exemplo - método final

Suponha que você não queira que o método Withdraw de

SavingsAccount seja sobreposto

@Override

public final void withdraw(double amount) {

balance -= amount;

Pra quê?

• Segurança: dependendo das regras do negócio, às vezes é desejável

garantir que uma classe não seja herdada, ou que um método não

seja sobreposto.

• Geralmente convém acrescentar final em métodos sobrepostos, pois

sobreposições múltiplas podem ser uma porta de entrada para

inconsistências

• Performance: atributos de tipo de uma classe final são analisados de


forma mais rápida em tempo de execução.

• Exemplo clássico: String

Polimorfismo
Em Programação Orientada a Objetos, polimorfismo é recurso que

permite que variáveis de um mesmo tipo mais genérico possam

apontar para objetos de tipos específicos diferentes, tendo assim

comportamentos diferentes conforme cada tipo específico.

Account x = new Account(1020, "Alex", 1000.0);

Account y = new SavingsAccount(1023, "Maria", 1000.0, 0.01);

x.withdraw(50.0);

y.withdraw(50.0);

Classes abstratas
• São classes que não podem ser instanciadas

• É uma forma de garantir herança total: somente subclasses não

abstratas podem ser instanciadas, mas nunca a superclasse abstrata

Questionamento

• Se a classe Account não pode ser instanciada, por

que simplesmente não criar somente SavingsAccount

e BusinessAccount?

• Resposta:

Reuso

• Polimorfismo: a superclasse classe genérica nos permite tratar

de forma fácil e uniforme todos os tipos de conta, inclusive

com polimorfismo se for o caso (como fizemos nos últimos

exercícios). Por exemplo, você pode colocar todos tipos de

contas em uma mesma coleção.

• Demo: suponha que você queira:

• Totalizar o saldo de todas as contas.

• Depositar 10.00 em todas as contas.


Exceções

• Uma exceção é qualquer condição de erro ou comportamento

inesperado encontrado por um programa em execução

Uma exceção é uma condição causada por um erro em tempo de execução que interrompe o
fluxo normal de execução. Esse tipo de erro pode ter muitas causas, como uma divisão por
zero.

Quando uma exceção ocorre em Java, é criado um objeto, chamado de exception object, que
contém informações sobre o erro, seu tipo e o estado do programa quando o erro ocorreu.
Após ser criado, esse objeto é entregue para o sistema de execução da Máquina Virtual Java
(MVJ), processo chamado de lançamento de exceção.

Quando a exceção é lançada por um método, o sistema de execução vai procurar na pilha de
chamadas (call stack) um método que contenha um código para tratar essa exceção. O bloco
de código que tem por finalidade tratar uma exceção é chamado de exception handler
(tratador de exceções).

A busca seguirá até que o sistema de execução da MVJ encontre um exception handler
adequado para tratar a exceção, passando-a para ele. Quando isso ocorre, é verificado se o
tipo do objeto de exceção lançado é o mesmo que o tratador pode solucionar. Se for, ele é
considerado apropriado para aquela exceção. Quando o tratador de exceção recebe uma
exceção para tratar, diz-se que ele captura (catch) a exceção.

Quando fornece um código capaz de lidar com a exceção ocorrida, o programador tem a
possibilidade de evitar que o programa seja interrompido. Contudo, se nenhum tratador de
exceção apropriado for localizado pelo sistema de execução da MVJ, o programa será
terminado.

• Em Java, uma exceção é um objeto herdado da classe:

• java.lang.Exception - o compilador obriga a tratar ou propagar

• java.lang.RuntimeException - o compilador não obriga a tratar ou propagar

• Quando lançada, uma exceção é propagada na pilha de chamadas de

métodos em execução, até que seja capturada (tratada) ou o

programa seja encerrado


Por que exceções?
• O modelo de tratamento de exceções permite que erros sejam
tratados de forma consistente e flexível, usando boas práticas
• Vantagens:
• Delega a lógica do erro para a classe responsável por conhecer as regras que
podem ocasionar o erro
• Trata de forma organizada (inclusive hierárquica) exceções de tipos diferentes
• A exceção pode carregar dados quaisquer

Estrutura try-catch
• Bloco try
• Contém o código que representa a execução normal do trecho de código que
pode acarretar em uma exceção
• Bloco catch
• Contém o código a ser executado caso uma exceção ocorra
• Deve ser especificado o tipo da exceção a ser tratada (upcasting é permitido)
• Demo
Bom já que as exceções ficam em pilhas e importante saber o caminho dessas
exceções
Com o comando printStackTrace e possível saber isso

Aqui temos a exceção sendo tratada e comando sendo chamando pelo apelido da
exceção sendo “e” nesse caso
O rastro desse erros e bem fácil de identificar, mas vou deixa a aula do curso aqui só
pra relembra em caso de duvida 171

O erro aconteceu na linha 18 essa linha foi chamada pela linha 29 que foi chamada
pela 9, mas o erro estar na linha 18
Bloco finally
try {
}
catch (ExceptionType e) {
}
finally {
}
• É um bloco que contém código a ser executado independentemente de ter
ocorrido ou não uma exceção.
• Exemplo clássico: fechar um arquivo, conexão de banco de dados, ou outro
recurso específico ao final do processamento.
Resumo da aula
• Cláusula throws: propaga a exceção ao invés de trata-la
• Cláusula throw: lança a exceção / "corta" o método
• Exception: compilador obriga a tratar ou propagar
• RuntimeException: compilador não obriga
• O modelo de tratamento de exceções permite que erros sejam tratados de forma
consistente e flexível, usando boas práticas
• Vantagens:
• Lógica delegada
• Construtores podem ter tratamento de exceções
• Possibilidade de auxílio do compilador (Exception)
• Código mais simples. Não há aninhamento de condicionais: a qualquer momento que
uma exceção for disparada, a execução é interrompida e cai no bloco catch
correspondente.
• É possível capturar inclusive outras exceções de sistema

Lendo arquivo texto com classes File e Scanner

Classes
• File - Representação abstrata de um arquivo e seu caminho
• https://docs.oracle.com/javase/10/docs/api/java/io/File.html
• Scanner - Leitor de texto
• https://docs.oracle.com/javase/10/docs/api/java/util/Scanner.html
• IOException (Exception)
• https://docs.oracle.com/javase/10/docs/api/java/io/IOException.html
• FileReader (stream de leitura de caracteres a partir de arquivos)
[
• https://docs.oracle.com/javase/10/docs/api/java/io/FileReader.html
• BufferedReader (mais rápido)
• https://docs.oracle.com/javase/10/docs/api/java/io/BufferedReader.html
• https://stackoverflow.com/questions/9648811/specific-difference-
betweenbufferedreader-and-filereader

Bloco try-with-resources
• É um bloco try que declara um ou mais recursos, e garante que esses
recursos serão fechados ao final do bloco
• Disponível no Java 7 em diante
Classes
• FileWriter (stream de escrita de caracteres em de arquivos)
• https://docs.oracle.com/javase/10/docs/api/java/io/FileWriter.html
• Cria/recria o arquivo: new FileWriter(path)
• Acrescenta ao arquivo existente: new FileWriter(path, true)
• BufferedWriter (mais rápido)
• https://docs.oracle.com/javase/10/docs/api/java/io/BufferedWriter.html
Manipulando pastas com File
1 criando um array para comporta a path.listfiles(file::isDirectory)
Isso vai listar todas as a suas pastas
2 ira mostra todos so files do arquivo
3 uma função que para cria pastas retornado um boolean

Interfaces
Como um construtor define um os atributos que serão usados a interface obriga que a
classe que for implementa por ela tenho os métodos preá definidos
Usando a interface na forma mais genérica quando for preciso utiliza a classe

Economizando no tempo de manutenção de todo o programa

Inversão de controle e injeção de dependência


Inversão de controle e ato de tira a responsabilidade de instância uma class em um
certo lugar
Injeção de dependência
UMA forma de realizar a inversão de controle
Um componente interno instância a dependência, com a class utilizado um objeto mais
genérico pode ser :
Construtor, framework ...
Herdar vs interface
Quando temos um herança com polimorfismo e reaproveitado todo o conteúdo da
classe mais genérica pode rescrever os métodos e atributos, com a interface e possível
obriga a classe a definir aquelas funções
Com esse dois elementos e possível fazer um sistema de maior flexibilidade
Utilizando as duas como mostrado no
exemplo abaixo
Na pratica teremos uma interface definindo os método como sempre

Que vai ser implementada por uma classe abstrata com os atributos pre definidos
como o atributo color
Fazendo a classe mais especificas herdarem a “AbstractsShape”

Problema do diamante
A herança múltipla pode gerar o problema do diamante: uma ambiguidade causada
pela existência do mesmo método em mais de uma superclasse.
Herança múltipla não é permitida na maioria das linguagens!
E possível ter implementação de varias interfaces de uma classe, mas isso e discutido
se seria ou não um herança múltipla

Interface Comparable
Forma pelo método int compareTo(T o) T qual tipo de classe “o” o próprio objeto
System.out.println("maria".compareTo("alex"));
System.out.println("alex".compareTo("maria"));
System.out.println("maria".compareTo("maria"));Output:
12
-12
0
Implementada no objeto que for necessário compara “Comparable<tipo do objeto>”
Assim sua lista sera ordenada, para fazer em ordem decrescente “return
-variavel.compareTo(Other.getVariavel)”
Esse negativo vai fazer toda a magica de inverte os returns dos números
Obs: logica parecido com equals, mas diferente se tiver duvida aula 234

Default methods
• A partir do Java 8, interfaces podem conter métodos concretos.
• A intenção básica é prover implementação padrão para métodos, de modo
a evitar:
• 1) repetição de implementação em toda classe que implemente a interface
• 2) a necessidade de se criar classes abstratas para prover reuso da implementação
• Outras vantagens:
• Manter a retro compatibilidade com sistemas existentes
• Permitir que "interfaces funcionais" (que devem conter apenas um método)
possam prover outras operações padrão reutilizáveis
Lembrando que esse get e colocado ai apenas para não dar erro no código. Ele tem
que ser rescrito no classe que a interface for implementada
Generics
• Generics permitem que classes, interfaces e métodos possam ser parametrizados por tipo.
Seus benefícios são:

• Reuso

• Type safety

• Performance

Nesse código não estamos parametrizando a class, por isso temos que falar que o método
recebe um objeto T de tipo T <T> T, como e usado o comparable aqui só será aceito tipos de
elementos T que extends o tipo comparable
E possível fazer isso, deixando que qualquer super do T também seja aceita nesse
código utilizado o curinga

Wildcard types
Generics são invariantes , por exemplo uma lista integer não pode ser convertida para uma
lista object por isso isso utilizamos o <?> o super tipo de qualquer objeto

Podendo fazer funções que aceitem qualquer tipo de dado

Mas lembrando que não e possível fazer adição a esses tipos

bounded wildcards
quando e usado o <?> ele fala que o código aceita qualquer tipo de lista aqui, mas se
quisermos delimitar esse acesso e possível coloca que “? “ tem que ser uma sub class
ou super class de alguma class especifica <? Extends shape> podendo ser shape ou
qualquer class shape e possível também usar <? Super number> coloca isso so e
possível usar number e superclass de number
Com isso temos dois grandes problemas envolvendo get/put

Covariância
Onde e usado um classe e possível pega um class suas intensos, sendo possível converter,
acessa, mas não e possível adiciona pois o compilador não sabe o tipo da class que esse dado
vai podendo esse dado ser compatível ou não com sua futura class. Get ok

Contravariância
Quando e falando que o generic vai aceita uma class e suas superclass podendo fazer o put

hashCode e equals

• São operações da classe Object utilizadas para comparar se um objeto

é igual a outro

• equals: lento, resposta 100%

• hashCode: rápido, porém resposta positiva não é 100%

• Tipos comuns (String, Date, Integer, Double, etc.) já possuem

implementação para essas operações. Classes personalizadas

precisam sobrepô-lasRegra de ouro do HashCode


• Se o hashCode de dois objetos for diferente, então os dois objetos são diferentes

• Se o código de dois objetos for igual, muito provavelmente os objetos são iguais (pode haver
colisão)

Set <T>

• Representa um conjunto de elementos (similar ao da Álgebra)

• Não admite repetições

• Elementos não possuem posição

• Acesso, inserção e remoção de elementos são rápidos

• Oferece operações eficientes de conjunto: interseção, união, diferença.

• Principais implementações:

• HashSet - mais rápido (operações O(1) em tabela hash) e não ordenado

• TreeSet - mais lento (operações O(log(n)) em árvore rubro-negra) e ordenado pelo


compareTo do objeto (ou Comparator)

• LinkedHashSet - velocidade intermediária e elementos na ordem em que são adicionados

Alguns métodos importantes

• add(obj), remove(obj), contains(obj)

• Baseado em equals e hashCode

• Se equals e hashCode não existir, é usada comparação de ponteiros

• clear()

• size()

• removeIf(predicate)

• addAll(other) - união: adiciona no conjunto os elementos do outro conjunto, sem repetição

• retainAll(other) - interseção: remove do conjunto os elementos não contitos em other

• removeAll(other) - diferença: remove do conjunto os elementos contidos em Other


Set.contains() verifica se essse elemento objeto existi o seu set

Map<K,V>
• https://docs.oracle.com/javase/10/docs/api/java/util/Map.html

• É uma coleção de pares chave / valor

• Não admite repetições do objeto chave

• Os elementos são indexados pelo objeto chave (não possuem posição)

• Acesso, inserção e remoção de elementos são rápidos

• Uso comum: cookies, local storage, qualquer modelo chave-valor

• Principais implementações:

• HashMap - mais rápido (operações O(1) em tabela hash) e não ordenado

• TreeMap - mais lento (operações O(log(n)) em árvore rubro-negra) e ordenado pelo

compareTo do objeto (ou Comparator)

• LinkedHashMap - velocidade intermediária e elementos na ordem em que são adicionados

• put(key, value), remove(key), containsKey(key), get(key)

• Baseado em equals e hashCode

• Se equals e hashCode não existir, é usada comparação de ponteiros

• clear()

• size()

• keySet() - retorna um Set<K>

• values() - retornaa um Collection<V>

Programação funcional
Primeiro vamos voltar um pouco na interface comparable usada para compara e ordena lista
etc. Como na programação a vários formas de fazer uma mesma coisa, aqui não e diferente
sendo possível utilizar a inteface funcional(que tem apenas um método abstrato/obrigatório)
comparator para o mesmo uso criando uma class que implementa essa
Diferente da comparable onde a interface era implementada onde ira ser usada, aqui e criada
outra class isso e usado pois a manutenção fica mais fácil de ser realizada

Exemplo: list.sort(new MyComparator()) para fazer uso da class

Só que novamente e possível fazer isso de varias formas com o comparator em implementado
em uma class separada como vimos antes ou como:

• Comparator objeto de classe anônima onde temos a instanciação do class com método na
class programan com

• Comparator objeto de expressão lambda sem chaves onde não e preciso instanciar o
comparator e coloca o tipo das variáveis que entram nesse código

• Comparator expressão lambda "direto no argumento" não e mais preciso de quase nada so a
expressão que pode ser jogada em uma variável ou direto no método sort (arrow function)

Paradigmas de programação

• Imperativo (C, Pascal, Fortran, Cobol)

• Orientado a objetos (C++, Object Pascal, Java (< 8), C# (< 3))

• Funcional (Haskell, Closure, Clean, Erlang)

• Lógico (Prolog)

• Multiparadigma (JavaScript, Java (8+), C# (3+), Ruby, Python, Go)

Programação funcional

A programação funcional é um paradigma de programação - um estilo de construção


da estrutura e dos elementos dos programas de computador - que trata a computação
como a avaliação de funções matemáticas e evita a mudança de estado e dados
mutáveis.
Portanto, na programação funcional, existem duas regras muito importantes:

 Sem mutações de dados: significa que um objeto de dados não deve ser
alterado após ser criado.
 Nenhum estado implícito: O estado oculto / implícito deve ser evitado. Na
programação funcional, o estado não é eliminado, mas tornado visível e
explícito

Isso significa:

 Sem efeitos colaterais: Uma função ou operação não deve alterar nenhum
estado fora do seu escopo funcional. Ou seja, uma função deve retornar apenas
um valor ao invocador e não deve afetar nenhum estado externo. Isso significa
que os programas são mais fáceis de entender.
 Somente funções puras: o código funcional é idempotente. Uma função deve
retornar valores apenas com base nos argumentos passados e não deve afetar
(efeito colateral) ou depender do estado global. Tais funções sempre produzem
o mesmo resultado para os mesmos argumentos.

Transparência referencial
Uma função possui transparência referencial se seu resultado for sempre o mesmo

para os mesmos dados de entrada. Benefícios: simplicidade e previsibilidade.

Por exemplo se e usado um api para realizar um calculo e essa api tem números que podem
varia esse faz com que mesmo colocando os mesmo elemento o calculo pode sair diferente

Funções são objetos de primeira ordem (ou primeira classe)


Isso significa que funções podem, por exemplo, serem passadas como parâmetros de

métodos, bem como retornadas como resultado de métodos.

Funções lambdas
São funções de primeira classe não nomeadas
Recursão

Tenta fazer o que o loop faz só que de forma mais limpa, mas geralmente mais limpo não que
dizer mais legível e também um recursão pode estoura a pilha(stack overflow) e também e
mais lenta que a forma interativa(loop)

Interface funcional
Funções que só tem um método abstrato . Suas implementações pode ser passada com
lambdas como e visto no comparator e:

Algumas outras interfaces funcionais comuns

• Predicate

• https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html

• Function

• https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html

• Consumer

• https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html

• Nota: ao contrário das outras interfaces funcionais, no caso do Consumer, é

esperado ele possa gerar efeitos colaterais

Predicate

Interface funcional com o método test retorna um booleano, parecido com o comparator
pode ser usado criando Implementação da interface e passado a instância para o removeif()
por exemplo

Reference method com método estático

Faz um método na class que for necessário

método static trabalha com o objeto que vai ser passado como parâmetro e não static vai
trabalha com seu próprio objeto

Exemplo list.removeoif(Product:: nonStaticProductPredicate)

E possivel tambem fazer um objeto com lambda ou apenas passa a lambda direto na função
Consumer

Com o método accept usado para modificar um elemento baseado na regra que for
implementada

Function

Recebe um dado e converter para outro. Não muda, mas sim converte

Criando funções de primeira ordem


Para fazer isso temos que coloca a função como parâmetro para ser usado podendo verifica,
muda ou troca o tipo do dado

Stream
• É uma sequencia de elementos advinda de uma fonte de dados que oferece suporte a
"operações agregadas".

• Fonte de dados: coleção, array, função de iteração, recurso de E/S

Características

• Stream é uma solução para processar sequências de dados de forma:

• Declarativa (iteração interna: escondida do programador)

• Parallel-friendly (imutável -> thread safe)

• Sem efeitos colaterais

• Sob demanda (lazy evaluation)

• Acesso sequencial (não há índices)

• Single-use: só pode ser "usada" uma vez

• Pipeline: operações em streams retornam novas streams. Então é possível criar uma cadeia
de operações (fluxo de processamento).
Operações intermediárias e terminais

• O pipeline é composto por zero ou mais operações intermediárias e

uma terminal.

• Operação intermediária:

• Produz uma nova streams (encadeamento)

• Só executa quando uma operação terminal é invocada (lazy evaluation)

• Operação terminal:

• Produz um objeto não-stream (coleção ou outro)

• Determina o fim do processamento da stream

Operações intermediárias

• filter

• map

• flatmap

• peek

• distinct

• sorted

• skip

• limit (*)

* short-circuit

Operações terminais

• forEach

• forEachOrdered

• toArray

• reduce

• collect

• min

• max

• count

• anyMatch (*)

• allMatch (*)

• noneMatch (*)
• findFirst (*)

• findAny (*)

* short-circuit

Java Database Connectivity jdbc


Api padrão usada para acesso com banco de dados pacotes auxiliares java.sql e java.sqlx

Usado a aplicação feita em java passando pelo jdbc fazendo o acesso em diferentes bancos de
dados

Fazendo a conexão com o banco de dados


Primeiro de tudo iremos fazer a leitura do banco utilizando essa esse elementos
Esse método vai utiliza da class Properties que vai armazena os dados do arquivo como rooot e
utilizado a minha exception porque ela e runtimeException sendo trata em tempo de execução
para não precisa fica colocando try/catch em todo lugar

Aquivo e onde de fato ira ser realizada a conexão, conectar com o banco de dados com o jdbc
e instanciar um objeto Connection que e intasiado com null na cabeça da class

Depois e so fazer um metodo closeConnection para fechar


Outra forma de abrir e com Connection conn = DriverManager.getConnection(host, uName,
uPass);

Recuperar Dados
Statement serve para montar um comando sql

ResultSet vai representa o resultado dessa consulta em forma de tabela

Algumas operações do ResultSet

first() [move para posição 1, se houver]

o beforeFirst() [move para posição 0]

o next() [move para o próximo, retorna false se já estiver no último]

o absolute(int) [move para a posição dada, lembrando que dados reais começam em 1]

inserir dados
aqui e vamos usar o PreparedStatement(usado também para fazer atualizações)para recebe
um script sql fazendo a inserção na tabela

Deletando dados
Primeiro tem que ser criado um exception para a integridade referencial um exemplo desse
erro e quando e apagado um departamento por exemplo que e usado a como chave
estrangeira em outro lugar do banco

Como nesse banco não e possível deleta o depatmento 1, porque esta sendo usado em outro
local do banco

NUNCA ESQUEÇA DE COLCOA O WHERE

Transações

Quando e feito e uma mudança no banco de dados e importante ter um sistema contra falhas
em caso de interrupção na metade da mudança utilizando os comandos

setAutoCommit(false)

não deixa as mudanças ocorrem de forma automática

 commit()

Depois de analisado autoriza as mudanças

 rollback()

O processo for interrompido faz o banco de dados volta ao que era antes

DAO Pattern: Persistência de Dados utilizando o


padrão DAO
O padrão de projeto DAO surgiu com a necessidade de separarmos a lógica de negócios da
lógica de persistência de dados. Este padrão permite que possamos mudar a forma de
persistência sem que isso influencie em nada na lógica de negócio, além de tornar nossas
classes mais legíveis.

Classes DAO são responsáveis por trocar informações com o SGBD e fornecer operações CRUD
e de pesquisas, elas devem ser capazes de buscar dados no banco e transformar esses em
objetos ou lista de objetos, fazendo uso de listas genéricas (BOX 3), também deverão receber
os objetos, converter em instruções SQL e mandar para o banco de dados.

Toda interação com a base de dados se dará através destas classes, nunca das classes de
negócio, muito menos de formulários.
Se aplicarmos este padrão corretamente ele vai abstrair completamente o modo de busca e
gravação dos dados, tornando isso transparente para aplicação e facilitando muito na hora de
fazermos manutenção na aplicação ou migrarmos de banco de dados.

Também conseguimos centralizar a troca de dados com o SGBD (Sistema Gerenciador de


Banco de Dados), teremos um ponto único de acesso a dados, tendo assim nossa aplicação um
ótimo design orientado a objeto.

Java ee Java Enterprise Editio


E um conjunto de especificações

A partir de agora ou usar ferramentas com sprint tools(sts) uma ide que ajuda no
desenvolvimento com spring, mas tem um plugin para eclipse e postman uma ferramenta que
ajuda a fazer requisições e teste em apis

Não e mais preciso traduzir o banco de dados relacional para objetos agora

Java Persistence API (JPA) é a especificação padrão da plataforma Java EE (pacote


javax.persistence) para

mapeamento objeto-relacional e persistência de dados.

JPA é apenas uma especificação (JSR 338):

http://download.oracle.com/otn-pub/jcp/persistence-2_1-fr-eval-spec/JavaPersistence.pdf

Para trabalhar com JPA é preciso incluir no projeto uma implementação da API (ex: Hibernate).

Arquitetura de uma aplicação que utiliza JPA: hibernet

Principais classes: EntityManager


https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html

Um objeto EntityManager encapsula uma conexão com a base de dados e serve para efetuar
operações de acesso a dados (inserção, remoção, deleção, atualização) em entidades (clientes,
produtos, pedidos, etc.) por ele monitoradas em um mesmo contexto de persistência. Escopo:
tipicamente mantem-se uma instância única de EntityManager para cada thread do sistema
(no caso de aplicações web, para cada requisição ao sistema). EntityManagerFactory
https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManagerFactory.html Um
objeto EntityManagerFactory é utilizado para instanciar objetos EntityManager. Escopo:
tipicamente mantem-se uma instância única de EntityManagerFactory para toda aplicação.
Trabalhando com maven

Primeira coisa e nomear o groupid(algum nome envolvendo a empresa) e o artifactid(nome do


seu projeto)

Quando for usar Project maven e necessário atualizar o arquivo xml que vai estar na raiz do
projeto

<properties>

<maven.compiler.source>17</maven.compiler.source>

<maven.compiler.target>17</maven.compiler.target>

</properties>

Usado esse código para mudar a versão do código. Logo depois e necessário baixar as
dependências maven (so pesquisa hibernate maven)

<dependencies>

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-core</artifactId>

<version>5.4.12.Final</version>

</dependency>

Então eu vou fazer um <dependency> e nele vai ter vários elementos dependency

Nesse caso o hibernate-core, hibernate-entitymanager e o mysql-connector quando esse


algoritimos são colocados no arquivo xml ele faz o download automaticamente

Agora vamos de que usar a configuração do jpa pelo arquivo "persistence.xml"

 Crie uma pasta "META-INF" a partir da pasta "resources"(folder)

 Dentro da pasta META-INF crie um arquivo "persistence.xml"

 Conteúdo do arquivo persistence.xml:

Desmembrando o persistence.xml: veja o arquivo explicandopersistence.xml"


Mapeamento com jpa

Obs:@org.hibernate e a implementação do jpa. Pode usar o javax.persistence mesmo

@entity e o que vai indica que esse objeto vai ser Entity no seu banco de dados

@id para passa o id com @genaretedValue(strategy=GenerationType.IDENTITY) para o próprio


hibernate cria e passa o id

@column para dar outro nome ao campo no banco de dados

Depois de instanciar o entityManagerFactory ai podemos coloca o o Entitymanager que vai


começar os trabalhos

Primeiro que toda fez que for feito algo diferente de consultar o banco de dados temos que
inicia o com em.getTransaction().begin()

O comando persist vai fazer a inserção dos elementos

Não pode esquecer de fecha as duas classes do hibernate

Entidade monitorada

Um objeto monitorado é aquele que acabou de ser inserido ou que a foi feito um consulta.
Com o objeto monitorado e possível fazer a remoção dele por exemplo

Começando um projeto com spring boot

Basic entity checklist:

 Basic attributes

 Associations (instantiate collections)

 Constructors

 Getters & Setters (collections: only get)

 hashCode & equals

 Serializable
essa class criada em novo package no src/main depois vamos fazer um resource que vai ser o
controlador de sua respectiva Entity

A anotação @RestController no framework Spring é usada para marcar uma classe como um
controlador da web que lida com requisições HTTP e envia respostas HTTP como saída. O
@RestController é uma combinação de duas outras anotações do Spring: @Controller e
@ResponseBody.

Aqui está o que cada parte faz:

1. @Controller: Esta anotação marca a classe como um controlador da web no Spring. Ela
indica que a classe contém métodos que tratam solicitações HTTP.

2. @ResponseBody: Esta anotação indica que o valor retornado por um método


controlador deve ser serializado diretamente em um corpo de resposta HTTP. Isso é
útil quando você deseja retornar dados em um formato específico, como JSON ou
XML, em vez de renderizar uma visão em HTML.

@RequestMapping("prefix"): Determina qual a URI comum para todos os recursos


disponibilizados pelo Controller.

@GetMapping: Determina que o método aceitará requisições HTTP do tipo GET

ResponseEntity<T> e um tipo epecifico que retorna resposta de requisições web

Utilizando o h2
O H2 é um sistema de gerenciamento de banco de dados relacional em memória que é escrito
em Java. Ele é conhecido por ser um banco de dados leve, rápido e de código aberto,
projetado principalmente para desenvolvimento, testes e prototipagem. O H2 oferece suporte
à maioria dos recursos SQL padrão e pode ser executado como um servidor de banco de dados
ou em modo incorporado dentro de sua aplicação Java.
Checklist:

1 JPA & H2 dependencies

2 application.properties

3 application-test.properties

4 Entity: JPA mapping

1 E preciso baixa suas dependecias no arquivo pom.xml

2 Logo depois vamos ate o arquivo da maconha e colocamos application.properties:

spring.profiles.active=test

spring.jpa.open-in-view=true

3 application-test.properties nesse arquivo vamos fazer algumas configurações para o banco


de dados

4 fazer i mapeamento normal da class

JPA repository, dependency injection, database seeding


Checklist:

1UserRepository extends JPARepository<User, Long>

2 Configuration class for "test" profile

3 @Autowired UserRepository

4 Instantiate objects in memory

5 Persist objects

1 a classe JPARepository ja vai ter todas as funções para manipular o banco de dados

2 profile test já foi colocado na foi colocado no arquivo test.propriesties

3 @Autowired faz a injeção de dependência de forma automática, o que você faria com uma
função factory por exemplo

4 so colocar os objetos

5 aqui e criando um packge diferente onde ira ficar certa configurações para um perfil

Utilizando o @Configuration e indicado a função dessa class e @Profile(“exemplo”) para indica


em qual perfil essas configurações serão feitas
Service layer, component registration Order, Instant, ISO 8601 Basic new entity checklist:

 Entity o "To many" association, lazy loading, JsonIgnore

 Repository

 Seed

 Service

 Resource

Camada de serviço usada para aliviar a resourse já que a mesma so vai ser utilizada para tratar
requerimentos http a camada mais baixa usada para conversa com o data base a camada
service vai usar a repositor para trabalha entrega a resource

Lembrando que para usar o @autowrided a class tem que ser registrada component
registration podendo ser usada @component que seria uma forma mais genérica, mas e
possível fazer isso de forma mais semântica

Optional
Uma pequena pausa para entender o optional uma class que ajuda com os returns que seriam
null uma class dizendo que ele valor pode existir ou não

A primeira coisa seria como fazer um optional:

Temos os Optional.of(elemento) se o valor tem a possiblidade de for null o


Optional.ofNullable(null) e usado criando um Optional.empty() que retorna um Optional vazio

Para obter o item no Optional:

Acabamos de retorna esse optional e passa para a variável opt para pega esse elemento
temos:

Opt.get() que retorna o elemento se esse elemento não existir cai um erro
Opt.ifPresent(n-> n+2) recebe uma lambda(consumer) que so vai ser executada se esse valor
existir

Opt = Integer.valueof(“5”).orElse(0) orElseGet(()-> 6) vai fazer a mesma coisa, mas sendo


possível passar um lambada aqui

OrThrow(()->{return newException)

Pathvarible e usado nas variáveis atuais complementando o link com o id

Order, Instant, ISO 8601

Basic new entity checklist:

 Entity

o "To many" association, lazy loading, JsonIgnore

 Repository

 Seed

 Service

 Resource

Acabou de ser feito uma associação o que causa um via de mão dupla, logo a biblioteca de
serialização que e Jackson fica chamando a duas entidade sem para. O Jsonignore que vai
fazer esse controle melhor das

OrderStatus enum
Quando um enum e colocado como atributo em entidade que vai ser usada em banco de
dados e importante enumera o mesmo, porque cada elemento do enum ira ser um número e
se futuramente for adicionado mais uma categoria essa sequencia será quebrada

Por isso o código o enum vai ficar com uma cara um pouco diferente

Obs: é possível ver como implementa esse tipo na class Order


relação manytomany

essa associação vai ter sua própria tabela e para fazer issso utilizamos jointable que vai cria e

nomear essa associação

e esse seria de comandos ajudam a cria essa pequena tabela.

Lembrando que e importante indica para outra parte o jsonIgnore e

com quem ela vai se relacionar com mappedBy

OrderItem, many-to-many association with extra attributes


Checklist:
 OrderItemPK
 OrderItem
 Order one-to-many association
 Seed

@Embeddable:

 A anotação @Embeddable é usada para marcar uma classe como uma classe
incorporável (embeddable class). Uma classe incorporável é uma classe que
não representa uma entidade por si só, mas é usada para representar parte de
uma entidade.
 Por exemplo, se você tem uma entidade Endereço que é composta por
várias propriedades (como rua, cidade, estado, CEP), você pode criar uma
classe incorporável Endereço usando @Embeddable para representar
esses campos.
 Classes incorporáveis podem ser incorporadas em entidades usando a
anotação @Embedded.
2. @EmbeddedId:

 A anotação @EmbeddedId é usada para marcar uma propriedade de uma


entidade como a chave primária composta da entidade.
 Uma chave primária composta é aquela que consiste em mais de um atributo,
geralmente incluindo uma ou mais classes incorporáveis (marcadas com
@Embeddable) para representar parte da chave primária.
 Ao usar @EmbeddedId, você declara uma classe que contém os atributos que
compõem a chave primária composta e anota essa classe com
@Embeddable. Em seguida, você anota a propriedade da entidade que será
usada como a chave primária com @EmbeddedId.

Usada para cria um class que não e uma entity, que vai fazer parte de um ou mais entity

Payment, one-to-one association

@MapsId e usado para herdar o mesmo id da classe que vai ter a associação . Como nessa esta
sendo feito uma relação de onetoone
@OneToOne(mappedBy="order",cascade = CascadeType.ALL)

o CascadeType.all viabiliza das duas entidade terem o mesmo id

Subtotal & Total methods

nessa aula que aprendi que o importante que o padrão do javaEE e colocar o get na função
para ela ser mostrada na reposta(arquivo json)

insert user

então começando na class service e implementada a função insert

mas no controlador é uma boa pratica fazer o metodo post do http retorna o status 201 que
indica a criação de ago novo no seu sgbd

1. e colocado a annotaion PostMapping para indica o tipo de requisição que esse método
trata

2. @RequestBody desserializa o corpo da requisição http para ser usado como objeto
3. Uma URI (Uniform Resource Identifier) de localização no contexto do protocolo HTTP
(Hypertext Transfer Protocol) é um tipo de URI que é usada para indicar a localização
de um recurso na web. Ela é frequentemente usada em conjunto com respostas HTTP,
em particular nas respostas com códigos de status 201 (Created) e 202 (Accepted).

Quando um servidor HTTP responde a uma solicitação com um código de status 201 ou 202,
ele geralmente inclui uma URI de localização no cabeçalho da resposta, especificando onde o
recurso recém-criado ou o estado aceito pode ser encontrado. Isso fornece ao cliente
informações sobre onde encontrar ou acessar o novo recurso ou o recurso cujo estado foi
aceito.

E para contruir essa uri e usado a class URI utlizando a class ServletUriComponentsBuilder com
o metodo fromCurrentRequest que vai devolver a uri atual da requisição que esta sendo usada
logo depois path(“valor”) adciona algo a mais nessa uri como o numero do id, e
buildAndExpand pega o conteudo que vai ser colocado em path e toUri converte toda essa
merda novamente

delete User

o delete um codigo um pouco diferente, porque na teoria ele não retorna nada tanto que o
service.delete e do tipo void, mas no resourse

e bem simples apenas retorno um noContent que já ajuda com o retono do codigo http sendo
o 204 que informa que algo foi deletado

O erro 405 Método Não Permitido ocorre quando o servidor web está configurado de tal
forma que não permite que você realize uma ação específica em uma URL em particular

O erro 500 é um status de erro HTTP que indica uma dificuldade de processamento do
servidor, a partir de uma incompatibilidade ou configuração incorreta. Tambem ocorre quando
algo que vai ser deletado impacta em outra entidade do servidor

o erro 502

o erro 404 e quando a url não e encostrada

upadate User
User entity = repository.getReferenceById(id);

apenas deixa o objeto sendo monitorado o que permite a atualização

Exception handling – findById


a primeira coisa e cria uma exception no packgae service logo

depois e feito outro package exception no resoucer nesse vamos ter duas class a primeira e o
StandardError onde vai ficar a estrututra que aparecera quando aparecer aquele json

a outra sera a ResoucerHandler

@CrontrollerAdivece No contexto do desenvolvimento Java, ControllerAdvice é uma


anotação utilizada na estrutura Spring MVC, que faz parte do ecossistema do Spring
Framework. Ela é usada para definir classes que fornecem aconselhamento global para
controladores, ou seja, permite definir um conjunto de métodos que podem ser executados
globalmente para controlar exceções e personalizar o comportamento de controladores em
toda a aplicação.

Esse parametro request e um HttpServeltRequest que vai me dar o caminho ,Então eu


configuro os atributos do json lançado e annotion ExceptionHandler (Exception.class) permite
interferir quando esse erro ocorre

Deploy

acid

Você também pode gostar