FAQ - Frequently Asked Questions

Muitas destas respostas são simplificadas por se tratar de um curso muito básico de Java. Respostas mais completas, e em alguns casos corretas, podem ser encontradas no FAQ da disciplina de OO e Java, na qual serão vistos os demais conceitos de Orientação a Objetos. Por isso somos obrigados a dar respostas simplificadas ou "momentaneamente" incorretas, no que diz respeito a totalidade dos conceitos da Orientação a Objetos.

RESPOSTAS 

  1. Como os erros devem ser reportados antes de aprender a lidar com exceções? Já que não é permitido o uso de System.out.println em classes que não são de interface com o usuário!
  2. Os alunos devem utilizar a exceção RuntimeException da seginte forma:
    Onde seria usado
                  System.out.println(mensagem)
    deve-se usar
                  throw new RuntimeException(mensagem)
    No mais nada em relação a exceções deve ser explicado até a aula sobre o assunto!
  3. Podemos comparar objetos utilizando o operador ==? Qual a diferença entre usar o método equals e o operador ==?
    O operador == compara as referências, ou seja, os valores que as variáveis têm. Assim a comparação verifica se duas variáveis referenciam, apontam para, o mesmo objeto. Neste caso há uma verificação de identidade.
    Já o método equals normalmente compara atributos, dados do objeto, para decidir se um objeto é igual (não necessariamente idêntico) a outro. Mas para isso você deve redefinir o método na classe em questão, caso contrário o método herdado de Object é equivalente ao operador ==.

    A definição do método equals deve seguir a seguinte forma:

                public class X {
                    T a1;
                    int a2;
                    // ...
                    
                    public boolean equals(X x) {
                        boolean resposta = false;
                        // compara os atributos de this e de x
                        // de modo a fornecer a semântica de igualdade entre dois
                        // objetos, por exemplo:
                        resposta = x.a1.equals(this.a1) && (x.a2 == this.a2);
                        return resposta;
                    }
                }
                
  4. Como posso manipular datas?
    Dê preferência ao uso das classes java.util.Calendar e java.util.GregorianCalendar. Ex.:
            Calendar hoje = Calendar.getInstance();
            int dia = hoje.get(Calendar.DAY_OF_MONTH);
            int mes = hoje.get(Calendar.MONTH); 
            int ano = hoje.get(Calendar.YEAR);
            
    Para mais informações vejam a documentação.
  5. O que é e como será feita a classe fachada?
    A classe fachada é a classe que disponibiliza todos os serviços do sistema. É uma implementação do padrão de projetos Facade. A mesma deve ter como atributo todas as coleções de negócio (cadastros) do sistema, bem como disponibilizar métodos que chamem os métodos das coleções. Ainda é possível que a classe fachada faça verificações que envolvam mais de um cadastro, como, por exemplo, verificações de integridade do tipo: Antes de inserir uma conta no cadastro de contas verificar se o cliente da mesma está no cadastro de clientes do banco.
  6. Como determinar que classe básica possui uma coleção de outra classe em um relacionamento MxN?
    Esta escolha deve ser feita pelo grupo levando em conta a natureza da aplicação em questão. Normalmente a informação do relacionamento fica apenas de um lado (para diminuir a complexidade no uso de um mecanismo de persistência não OO). O lado que manterá a informação deve ser o que mais freqüentemente é consultado, ou o mais relevante, segundo a aplicação em desenvolvimento.
  7. Quando devemos criar uma outra classe básica para representar um relacionamento entre classes básicas? Ex.: Uma locadora que tem um cliente, um produto, e a relação locação que relaciona um produto a um cliente
    Normalmente essa classe é criada apenas quando existe um atributo oriundo deste relacionamento.
  8. Dado que uma classe deve possuir uma coleção de outra para implementar um relacionamento, a coleção usada deve ser de negócio (o cadastro) ou de dados (o repositório)?
    O uso da coleção de negócio provê um maior reuso de código, uma vez que as regras para cadastrar, consultar, e remover um objeto já estão implementadas no mesmo. Caso a coleção de dados fosse utilizada, a classe que usa a mesma deverá escrever tias regras. Por outro lado nem sempre as mesmas regras para incluir, remover, ou consultar um objeto no sistema deve ser utilizado para um relacionamento. Neste caso a coleção de dados deve ser reusada. Mais uma vez esta escolha deve ficar a cargo do grupo, uma vez que a mesma depende da natureza da aplicação sendo desenvolvida.
  9. Os métodos de inserção, atualização, remoção, e pesquisa tanto do repositório quanto do cadastro devem receber objetos ou atributos necessários para criar/identificar o objeto?
    Os métodos de inserção e atualização sempre recebem o objeto a ser inserido, não os atributos necessários para que ele seja criado ou atualizado. Já os métodos de remoção e pesquisa podem receber tanto um objeto, base para a busca usando o método match, quanto uma informação que possa identificar unicamente o objeto, dependendo do que for mais útil à aplicação. As duas abordagens podem ser adotadas em um mesmo projeto!
  10. Como deve ser realizada a busca por alguma classe básica caso a mesma possa ser procurada por vários critérios? Ex. Procurar uma pessoa pelo seu nome, ou pelo seu telefone.
    Definir na coleção de dados (repositório) o método procurar que recebe um objeto da classe básica, por exemplo B, com os atributos que se deseja procurar setados, e definir um método na classe básica B, public boolean match(B b) que compara o objeto recebido como parâmetro apenas com os atributos não nulos (condições de pesquisa). Assim o método match deve ser usado pelo repositório para pesquisar por objetos de uma classe básica. Dessa forma ao se percorrer o repositório, todas os objetos do repositório que "match" o objeto passado como parâmetro para a busca serão selecionados.
  11. Qual deve ser o tipo de retorno de um método de procura que retornar mais de um objeto básico como resposta? Ex. Usuários cujo nome começa com "Marcelo".
    O ideal é fazer o reuso da coleção de dados (RepositorioClasseBasicaArray ou Lista) criando uma nova instância da coleção com os elementos que satisfazem o critério da busca.
  12. Como exibir na GUI o resultado de uma consulta que retorna uma coleção de dados como resposta?
    Uma maneira, enquanto não aprendemos o conceito de interfaces, é definir o método getIterator() no repositório que retorna um array com os objetos contidos nos mesmos. Por exemplo, este método deve ser chamado da coleção de dados retornada como resposta de uma consulta, como dito no item anterior, para listar na GUI os objetos retornados como resposta. Numa classe  RepositorioPessoasArray o método deveria ser:
            public Pessoa[] getIterator() {...}
  13. Como alterar o código identificador de um objeto básico no sistema? Por exemplo, o CPF de uma pessoa Conta.
    Neste caso o sistema não deve utilizar o código (CPF) como o identificador para as operações do sistema. Cria-se um código interno que é utilizado pelo sistema para manipular os objetos.