<p><img src="https://i.imgur.com/D01Fpky.png" alt="" title="Entre no nosso site e veja nossos cursos"></p>
<h1>
<img class="emoji" alt=":coffee:" src="https://cdn.jsdelivr.net/npm/@hackmd/emojify.js@2.1.0/dist/images/basic/coffee.png"> Java OO Aula 4
</h1>
O objetivo deste curso é abordar os principais conceitos, empregar as principais estruturas de dados, e trabalhar utilizando as principais boas práticas de Programação Orientada a Objetos [POO] em **Java**.
<h2 id="-Tema-da-aula" data-id="-Tema-da-aula"><a class="anchor hidden-xs" href="#-Tema-da-aula" title="-Tema-da-aula"><span class="octicon octicon-link"></span></a><img class="emoji" alt=":book:" src="https://cdn.jsdelivr.net/npm/@hackmd/emojify.js@2.1.0/dist/images/basic/book.png">
<span> Tema da aula:</span></h2><span><p>Nessa quarta aula, mostramos um <strong>relacionamento 1-1</strong>, aliás, um <strong>auto-relacionamento</strong>. Pessoa tem um cônjuge.</p>
<p>Empregamos <em>DateTimeFormatter</em> para exibir as datas no formato dd/mm/aaaa; definimos um atributo como <strong>LocalDate</strong> [do Java 8]; utilizamos uma constante [<strong>final</strong>] para designar nosso local - para a formatação da data; e a partir daí, criamos um método para relacionar dos objetos da mesma classe.</p>
<p>Apresentamos o conceito de <strong>ENUM</strong>, recurso utilizado para restringir o uso de alguns valores específicos, de acordo com padrões utilizados na maioria das empresas; </p>
<p>Calculamos o intervalo entre duas datas, e exibimos esse intevalo em anos, meses, e dias e também apenas em dias. Para esse cálculo, utilizamos um objeto da classe <strong>Period</strong> e o método <strong>ChronoUnit</strong> - ambos do <strong>Java 8</strong>.</p>
<p>Exibimos os valores de dia da semana e mês escritos por extenso, como é necessário em várias situações.</p>
<p>Também, apresentamos uma maneira de medir o tempo de execução, em milisegundos, de um método - usando <strong>Instant e Duration</strong> - ambos do <strong>Java 8</strong>. </p>
<p>Por fim, apresentamos uma comparação de performance entre<strong> String, StringBuilder e StringBuffer.</strong></p></span>
<h4>
Estrutura do projeto depois de finalizado
</h4>

<h3>Pessoa.java</h3>
```java=
package entity;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import teoria.ContagemTempo;
import type.TypeSexo;
public class Pessoa {
private Integer id;
private String nome;
private TypeSexo sexo;
private Pessoa conjuge;
public static DateTimeFormatter dataf =
DateTimeFormatter.ofPattern("dd/MM/yyyy");
public static final Locale bra = new Locale("pt", "BR");
private LocalDate data_casamento;
public Pessoa() {
}
public Pessoa(Integer id, String nome, TypeSexo sexo,
Pessoa conjuge, LocalDate data_casamento) {
this.id = id;
this.nome = nome;
this.sexo = sexo;
this.conjuge = conjuge;
this.data_casamento = data_casamento;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public TypeSexo getSexo() {
return sexo;
}
public void setSexo(TypeSexo sexo) {
this.sexo = sexo;
}
public Pessoa getConjuge() {
return conjuge;
}
public void setConjuge(Pessoa conjuge) {
this.conjuge = conjuge;
}
public LocalDate getData_casamento() {
return data_casamento;
}
public void setData_casamento(LocalDate data_casamento) {
this.data_casamento = data_casamento;
}
public void casamento(Pessoa p1, Pessoa p2, LocalDate data) {
p1.setConjuge(p2);
p2.setConjuge(p1);
p1.setData_casamento(data);
p2.setData_casamento(p1.getData_casamento());
}
public static void main(String[] args) {
Pessoa p1 = new Pessoa(10, "joao",
TypeSexo.M, null, null);
Pessoa p2 = new Pessoa(11, "maria",
TypeSexo.F, null, null);
Pessoa p3 = new Pessoa(12, "jose",
TypeSexo.M, null, null);
Pessoa p4 = new Pessoa(13, "marcia",
TypeSexo.F, null, null);
p1.casamento(p1, p2, LocalDate.of(2017, 06, 22));
p3.casamento(p3, p4, LocalDate.of(2010, 01, 13));
System.out.println(p1.getNome() + " casou com "
+ p1.getConjuge().getNome());
System.out.println("Data do Casamento: "
+ p1.getData_casamento().format(dataf));
ContagemTempo ct = new ContagemTempo();
ct.calculoTempo(p1.getData_casamento());
System.out.println("* * *");
System.out.println(p3.getNome() + " casou com "
+ p3.getConjuge().getNome());
System.out.println("Data do Casamento: "
+ p3.getData_casamento().format(dataf));
ct.calculoTempo(p3.getData_casamento());
}
}
```
<h5>
Rodando o método main, temos:
</h5>
```=
joao casou com maria
Data do Casamento: 22/06/2017
3 Ano[s] 8 Mes[es] 12 Dia[s]
Total em dias: 1353
* * *
jose casou com marcia
Data do Casamento: 13/01/2010
11 Ano[s] 1 Mes[es] 21 Dia[s]
Total em dias: 4070
```
<h3>
TypeSexo.java
</h3>
```java=
package type;
public enum TypeSexo {
M, F;
}
```
<h3>
ContagemTempo.java
</h3>
```java=
package teoria;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.time.temporal.ChronoUnit;
import java.util.Locale;
public class ContagemTempo {
public static DateTimeFormatter dataf =
DateTimeFormatter.ofPattern("dd/MM/yyyy");
public static DateTimeFormatter horaf =
DateTimeFormatter.ofPattern("HH:mm:ss");
public static DateTimeFormatter horaAP =
DateTimeFormatter.ofPattern("hh:mm:ss a");
public static final Locale bra = new Locale("pt", "BR");
private LocalDate datai;
public LocalDate getDatai() {
return datai;
}
public void setDatai(LocalDate datai) {
this.datai = datai;
}
public void calculoTempo(LocalDate lc) {
Period periodo = Period.between(lc, LocalDate.now());
System.out
.println(periodo.getYears() + " Ano[s] "
+ periodo.getMonths() + " Mes[es] "
+ periodo.getDays() + " Dia[s]");
System.out.println
("Total em dias: "
+ ChronoUnit.DAYS.between(lc, LocalDate.now()));
}
public static void main(String[] args) {
System.out.println(LocalDate.now().format(dataf));
System.out.println(LocalDateTime.now().format(horaf));
System.out.println(LocalDateTime.now().format(horaAP));
System.out.println("---");
System.out.println(LocalDate.now()
.getDayOfWeek()
.getDisplayName(TextStyle.FULL, bra));
System.out.println(LocalDate.now()
.getMonth().getDisplayName(TextStyle.FULL, bra));
System.out.println("---");
ContagemTempo ct = new ContagemTempo();
ct.setDatai(LocalDate.of(1971, 10, 24));
System.out.println(ct.getDatai().format(dataf));
ct.calculoTempo(ct.getDatai());
}
}
```
<h5>
Rodando o método main, temos:
</h5>
```=
06/03/2021
20:01:08
08:01:08 PM
---
sábado
março
---
24/10/1971
49 Ano[s] 4 Mes[es] 10 Dia[s]
Total em dias: 18031
```
<h3>
TesteString.java
</h3>
```java=
package teoria;
import java.time.Duration;
import java.time.Instant;
public class TesteString {
public static void main(String[] args) {
StringBuffer strFinal = new StringBuffer();
Instant inicio = Instant.now();
for (int count = 1; count <= 100000; count++) {
strFinal.append("a");
}
Instant fim = Instant.now();
Duration duracao = Duration.between(inicio, fim);
long duracaoEmMilissegundos = duracao.toMillis();
System.out.println("\nStringBuffer: "
+ duracaoEmMilissegundos);
StringBuilder strFinala = new StringBuilder();
Instant inicioa = Instant.now();
for (int count = 1; count <= 100000; count++) {
strFinala.append("a");
}
Instant fima = Instant.now();
Duration duracaoa = Duration.between(inicioa, fima);
long duracaoaEmMilissegundos = duracaoa.toMillis();
System.out.println("\nStringBuilder: "
+ duracaoaEmMilissegundos);
String strFinalb = "";
Instant iniciob = Instant.now();
for (int count = 1; count <= 100000; count++) {
strFinalb += "a";
}
Instant fimb = Instant.now();
Duration duracaob = Duration.between(iniciob, fimb);
long duracaobEmMilissegundos = duracaob.toMillis();
System.out.println("\nString: "
+ duracaobEmMilissegundos);
}
}
```
<h5>
Rodando o método main, temos:
</h5>
```=
StringBuffer: 22
StringBuilder: 5
String: 2525
```
<span></span></p><blockquote style="border-left-color: red;">
<p><span class="color" data-color="red"></span><span> </span><small><i class="fa fa-user"></i> Prof Fernando Gomes - fernandojnr@gmail.com</small></p>