Local: Laboratório LEP 1 (às 2as) e sala F2-006 (às 4as e 6as).
Horário: das 8h às 10h.
Início: 11 de março de 2019.
Provas:
- P1: 22/05 (código aqui)
- P2: 26/06 (código aqui)
- P3: 01/07
Repositório do código criado em sala de aula:
https://github.com/vigusmao/Comp2_2019_1
Para ajudar nos estudos:
Apostila da Caelum
Monitor: Luiz Bernardo Levenhagen @bernarthough
Grupo no Telegram: bit.ly/CompII-UFRJ
Conteúdo das aulas
De 11/03 a 22/03
Aulas dadas pelo professor Judismar Arpini. Repositório.
Introdução ao curso. Explicações breves sobre Java, linguagens compiladas/interpretadas.
Sintaxe parecida com C.
I/O básico com a classe System: lendo do standard in (teclado) via Scanner e escrevendo no standard out (terminal).
Tratamento de exceções.
25/03
Laboratório 2.
Primeiros conceitos de orientação a objeto. Classe. Objeto. Atributos e métodos. Construtor. Overload/Override.
Código feito em sala de aula no
GitHub.
27/03
Modificadores de visibilidade public e private. Getters e setters. Setters com validação de parâmetros e
triggers para manter consistência do objeto. Métodos static.
Código feito em sala de aula no
GitHub.
29/03
Lazy instantiation. Atributos static. Atributos final.
O DRY principle (Don't Repeat Yourself). Um construtor chamando outro construtor (sobrecarga) via this(...<parâmetros>...).
Passagem de parâmetros default para métodos via overload (sobrecarga). Exemplo: Aritmetica.calcularRaiz(...).
Código feito em sala de aula no
GitHub.
01/04
LAB 3.
03/04
Herança (introdução).
Fazendo @Override de métodos para customizar o comportamento que já havia sido definido na super classe.
O construtor default (sem parâmetros) e o super() que é automaticamente
chamado (forçando a execução do construtor default da superclasse) quando você não chama explicitamente
o construtor da superclasse via super(...<parâmetros>...).
Código feito em sala de aula no
GitHub.
05/04
Polimorfismo. A questão dos pontos de vista do chamador e do executor.
A anotação @Override.
Forçando a execução de método da superclasse a partir do override do método
na subclasse via super.metodoDesejado(...<parâmetros>...).
Código feito em sala de aula no
GitHub.
08/04
LAB 4.
12/04
Métodos e classes abstract.
Código feito em sala de aula aqui
(continuação do exercício do LAB4 acrescentando métodos abstratos) e aqui.
15/04
LAB 5.
Diferença entre == (comparação entre primitivos, ou entre referências) e o método equals (comparação semântica entre objetos).
17/04
Resolução em sala dos exercícios do LAB 5. Mais sobre classes e métodos abstratos. Conversa inicial sobre unit tests.
24/04
Unit tests com JUnit. @Test, @Before. As boas práticas: regra de negócio escrita como msg a ser exibida em caso de falha,
ver primeiro o teste falhando, indicar o cenário do teste no próprio nome do método, usar o assert específico.
Código feito em sala aqui
e aqui.
26/04
Test-Driven Development (TDD).
Código feito em sala no GitHub.
29/04
LAB 6.
Código feito em sala no GitHub.
03/05
Resolução do LAB 6.
Como escrever unit tests para exceções.
Problema conceitual proposto: como adaptar o código para poder colecionar não apenas Figurinhas, mas também, digamos, Selos?
Código feito em sala no GitHub.
06/05
LAB 7.
Duas soluções (ruins) para o problema conceitual da aula passada.
1) Sublclasses AlbumFigurinha e AlbumSelo.
2) Superclasse Colecionavel para Figurinha e Selo.
Código feito em sala no GitHub.
08/05
Usando interface.
Código feito em sala no GitHub.
10/05
Generic types.
Código feito em sala no GitHub.
13/05
LAB 8.
17/05
Revisão para a P1.
Solução do LAB 8.
20/05
LAB 9 com o Professor Judismar Arpini.
Treino para a P1: a P1 do período anterior.
22/05
P1.
24/05
Resolução da P1 em sala de aula com o Professor Judismar Arpini.
27/05
LAB 10.
Código da P1 revisitado na prática. Cobertura de testes para a classe GuiaTuristico.
29/05
Packages. O package java.util. A interface List. A classe ArrayList.
A complexidade de tempo e espaço de se utilizar arrays subjacentes com crescimento em P.A. ou P.G.
Vimos que o crescimento em P.G. (por exemplo, dobrando-se o tamanho do array a cada vez que se tiver necessidade de mais espaço)
leva a tempo O(n) para se inserir n elementos; por outro lado, o crescimento em P.A. leva tempo quadrático O(n2).
Código feito em sala de aula no GitHub.
31/05
Mais do package java.util. A interface Set. A classe HashSet.
Noções preliminares de complexidade de algoritmos. Medindo tempo com System.currentTimeMillis().
Sorteando um inteiro com o método nextInt() de um objeto Random. Forçando-se a seed de um objeto Random.
O problema da interseção de listas. Três maneiras de resolvê-lo: a maneira ingênua;
a maneira em que se ordena uma das listas para permitir busca binária; e a maneira usando-se um HashSet auxiliar.
Análise de complexidade, observando as complexidades O(n^2), O(n log n) e O(n) dos algoritmos vistos, respectivamente.
Código comparativo feito em sala de aula no GitHub.
03/06
LAB 11.
05/06
A interface Map. A classe HashMap.
Código feito em sala de aula no GitHub.
07/06
Aula dada pelo professor Judismar Arpini.
Strings. StringBuffer / StringBuilder.
10/06
LAB 12.
12/06
StringBuilder vs concatenação direta em Strings. Commit feito em sala de aula no
GitHub.
Inner classes.
Usando mapas em problemas que aparentemente não os demandariam. O problema do contador de ocorrências.
Testes de performance fora dos unit tests.
Código feito em sala de aula no GitHub.
17/06
LAB 13.
19/06
O contrato do equals() com o hashCode().
Usando o enum (tipos enumeráveis) em Java.
Código feito em sala de aula no GitHub.
24/06
Static initializers. Veja o exemplo no enum Dinheiro aqui.
Exercícios do dia: LAB 14.
26/06
P2.