Questões de entrevistas

8 respostas
d34d_d3v1l

Galera,

gostaria de pedir para os mais experiêntes, tanto os que elaboram questões para entrevistas, tanto para os que respondem estes questionários, para postar aqui
algumas questões. Acho que será legal pra gente discutir, responder e tal :slight_smile:

Abraços

8 Respostas

perdeu

dar um codigo pequeno e zoado de forum ou de produção… pro cara refatorar ou reescrever… haha se vira meu amigooo
ou diagramas com tabelas não normalizadas

ViniGodoy
Já falei dessa questão em outro tópico, mas vale citar aqui: Complete a função abaixo:
void drawRegularPolygon(Graphics2D g2d, int sides, int radius) {
   //Seu código aqui
}

Usando da classe Graphics2D apenas o método g2d.drawLine(float x1, float y1, float x2, float y2).
Valide o fato de sides ter que ser >= 3.

Outra interessante:

Aponte os erros que você consegue identificar na classe abaixo:

public class ListaNaturais 
{
    private List<Integer> numeros = new ArrayList<Integer>();

    public ListaNaturais(List<Integer> numeros) {
        for (Integer numero : numeros) {
            if (numero < 0) throw new IllegalArgumentException("Os números devem ser naturais (>= 0)");
        }
        this.numeros = numeros;
    }

    public ListaNaturais(int ... numeros) {
        for (int numero : numeros) {
            add(numero);
        }
    }

    public void add(int numero) {
        if (numero < 0)
            throw new IllegalArgumentException("O número deve ser natural (>= 0)");
        numeros.add(numero);
    }

    public boolean remove(int numero) {
        return numeros.removeAll(numero);
    }

    public List<Integer> getNumeros() {
        return numeros;
    }
}
ErickRAR

removeAll é para collection e retorna booelan.

public List<Integer> getNumeros() { return numeros; }

O certo é retornar uma cópia do array, porque senão irá conseguir adicionar um valor negativo na lista.

ViniGodoy

A parte da cópia está certa. Ou vc retorna a cópia, ou retorna a coleção imodificável com Collections.unmodifiableList.

Agora, a do removeAll não está errado. List é filha de collection, portanto, suporta também o removeAll.

E existem mais erros.

ErickRAR

A parte da cópia está certa. Ou vc retorna a cópia, ou retorna a coleção imodificável com Collections.unmodifiableList.

Agora, a do removeAll não está errado. List é filha de collection, portanto, suporta também o removeAll.

E existem mais erros.

Eu me expressei mal. Queria dizer que deveria receber uma Collection.
E agora pelo seu post vi que esta parte precisa de cast

public ListaNaturais(Collection<Integer> numeros) { ... this.numeros = (List<Integer>) numeros;

Não achei outros…To fora da seleção. :lol:

ViniGodoy
ErickRAR:
Não achei outros..To fora da seleção. :lol:

Desculpe, arrumei o post original. Na questão o parâmetro de entrada é um List e não uma Collection (a Collection, na verdade, é parte da resposta).
Ainda assim, sua correção está errada. Não dá para fazer o cast desse jeito.

Segue o código com as correções comentadas:

public class ListaNaturais 
{
    private List<Integer> numeros = new ArrayList<Integer>();
    
    public ListaNaturais(Collection<Integer> numeros) {
        for (Integer numero : numeros) {
            if (numero < 0) throw new IllegalArgumentException("Os números devem ser naturais (>= 0)");
        }
        //1. É necessário copiar a lista aqui, caso contrário, também dará para inserir números negativos
        //Isso também torna possível receber uma collection no lugar da lista 
        //(desejável, mas não é erro manter a lista).
        this.numeros = new ArrayList<Integer>(numeros);
    }

    public ListaNaturais(int ... numeros) {
        for (int numero : numeros) {
            //2. Outra opção é mesmo usar esse add.
            //Mas isso não pode ser feito a menos que ele seja declarado como final ou private. 
            //Private não faz sentido nesse caso, então deixamos final.
            add(numero);
        }
    }

    public final void add(int numero) {
        if (numero < 0)
            throw new IllegalArgumentException("O número deve ser natural (>= 0)");
        numeros.add(numero);
    }

    public boolean remove(int numero) {
        return numeros.removeAll(numero);
    }

    public List<Integer> getNumeros() {
        //3. Como já foi corrigido, é necessário retornar uma versão não modificável da lista
        return Collection.unmodifiableList(numeros);
    }
}

Explicação dos problemas 1 e 3:
http://www.guj.com.br/java/104592-heranca#564414

Como inserir objetos inválidos se 1 e 3 não forem corrigidos:
List<Integer> lista = new ArrayList<Integer>();
ListaDeNaturais l = new ListaDeNaturais(lista);
lista.add(-1); //Note que essa instância está compartilhada dentro da lista!
ListaDeNaturais l = new ListaDeNaturais();
l.getNumeros().add(-1); //Retornei um ponteiro para a lista interna, posso chamar o add.

Já o problema 2 refere-se ao fato de que, se o método add não for final, ele estará sujeito a polimorfismo.
Normalmente não seria um problema se o método não estivesse sendo chamado no construtor. E o construtor é o único momento em que a classe pai existe, mas a parte do filho não foi criada ainda (lembre-se, a construção ocorre de cima para baixo).

Portanto, é incorreto chamar métodos polimórficos nesse momento.

ErickRAR

Errando e aprendendo…Gracias pelas explicações.
Essa questão é para júnior e pleno?

ViniGodoy

ErickRAR:
Errando e aprendendo…Gracias pelas explicações.
Essa questão é para júnior e pleno?

Pleno. Júniores geralmente procuram erros de sintaxe.

Criado 9 de julho de 2012
Ultima resposta 9 de jul. de 2012
Respostas 8
Participantes 4