quarta-feira, 29 de junho de 2011

Singleton Design Pattern

Boa noite pessoal, hoje vamos falar um pouco sobre design patterns, e o que são design patterns ?
design patterns são padrões de projeto feitos com um único objetivo, facilitar o entendimento, o desenvolvimento e manutenção além de ser uma solução elegante.

Singleton Design Pattern:

O Singleton define que uma certa classe deve ter apenas uma instancia dela mesma, ou seja uma classe do sistema só pode ter apenas uma instancia da classe Singleton, muito usádo em classes de Logs pois classes administradora de logs geralmente precisam fazer uma tarefa apenas, e seria muito custoso para o sistema criar uma nova instancia para cada vez que usarmos o Log, vou exibir um exemplo abaixo para ilustrar melhor.


public class LogWriter {
    private static LogWriter mInstance = new LogWriter(); //uma instancia estática privada encapsulada de  //LogWriter

    private LogWriter(){ //um construtor privado para que nenhuma outra classe possa acessar

    }

    public static LogWriter getInstance(){ //um método estático que retorna a única instancia que criamos
        return mInstance;
    }
}

Uma classe com essas caracteristicas garante uma única instancia no sistema.

Esse Pattern  é considerado um anti-pattern por existirem soluções melhores, acho válido listar algumas soluções melhores no futuro, mais sempre é valido pesquisar melhor.

Caso alguma das informações esteja errada ou algum dos meus leitores veja alguma coisa que possa ser melhorada, aceito sugestões e postarei créditos ao leitor respectivo..

Uma boa noite a todos.

terça-feira, 17 de maio de 2011

Um Pouco Sobre Abstração e Finalização de Classes Final

Boa noite pessoal,
bom esse é o ultimo post da série Abstração e Finalização de Classes, você pode conferir os dois primeiros posts clicando nos links abaixo:

Pt 1.
http://javeiros.blogspot.com/2011/05/um-pouco-sobre-abstracao-e-finalizacao.html
Pt 2.
http://javeiros.blogspot.com/2011/05/um-pouco-sobre-abstracao-e-finalizacao_17.html

E nesse post vou dar uma conclusão sobre os dois assuntos.

Uma breve revisão:

Classes Abstratas:
Vulgo (Abstract Classes) são as classes que tem o comportamento pré definido porém não completamente definido, e que para ser utilizada deve ser estendida por alguma outra classe afim de especificar os métodos pré definidos na própria definição. Muito utilizada para abstrair modelos genéricos do mundo real tal como Carros pode ser abstrata para CarrosEsporte.

Classes Finalizadas:
Vulgo (Final Classes) são as classes que já tem o comportamento definido, e que não pode ser modificado de maneira nenhuma ou seja não posso estender uma classe final pois o compilador entende que a implementação da classe já foi definida e que não pode ser mudada. Muito utilizada para abstrair modelos concretos do mundo real tal como um carro da Marca Eclipse pode ser uma classe finalizada com os métodos e propriedades definidos.

Para mais detalhes sobre os dois tipos de classes visite os dois links marcados no começo do post.

Considerações Finais:

Como vimos Abstração e Finalização são duas pontas diferentes do modelo orientado a objetos, um que abstrai o modelo e um que especifica o modelo (respectivamente falando) ou seja não podemos em hipotese nenhuma utilizar os dois juntos em uma mesma classe, pois se formos ver essa restrição tem sentido por exemplo:

public abstract final class Carro{
    public void acelera(); 
}

Se formos pensar bem, vamos ver que não tem sentido mesmo, já que a classe abstrata Carro citada no exemplo é abstrata e não pode ser instanciada e deve ser entendida, e uma classe finalizada acabaria com esse sentido pois tem a necessidade de ser instanciada e não pode ser estendida. Não sei se expliquei com as melhores palavras porém gostaria que os meus leitores fizessem um teste na IDE favorita e vejam o resultado pelos próprios olhos.

Bom espero ter ajudado a tirar algumas dúvidas, caso meus leitores vejam algum erro de sintaxe, lógica, ou de português por favor comentem, criticas construtivas são bem vindas.
Deixem o seu comentário.

Um Pouco Sobre Abstração e Finalização de Classes Pt 2

Boa noite pessoal hoje vamos falar um pouco sobre finalização de classes vulgo (Final Classes).

O que são classes finalizadas? bom isso é bem simples de explicar uma classe finalizada é toda classe que não deve ser estendida ou seja quando eu declaro uma classe como finalizada estou dizendo para o meu compilador que NENHUMA CLASSE sob circunstância nenhuma deve extender essa classe (Extends) vamos apresentar um exemplo:

public final class Caneta{
    private Cor corCaneta;
    private TipoCaneta tipoCaneta;
    public void escreveTexto(String texto){
      //write something
    }
}

Se eu tentar extender a classe Caneta como por exemplo:

public class CanetaExtendida extends Caneta{
    //Do something
}

Na hora de compilar a nossa classe o compilador vai apresentar o seguinte erro:

"The type CanetaExtendida cannot subclass the final class Caneta" (caso da Eclipse IDE)


Conclusão:

Classes finalizadas não são usadas normalmente no dia a dia, somente em casos raros em que são realmente necessárias tal como restringir o acesso a uma arvore de classes por exemplo:

*Diagrama

Classe Carro -
                      |
                      -> Classe Carro Esporte
                                                           -> Classe Final Eclipse
                      |
                      -> Classe Carro Sedan
                                                            -> Classe Final Honda Civic

Nesse exemplo eu quis dizer que temos duas subclasses de carro que são Carro Esporte e Carro Sedan, ambas classes podem ser extendidas e ter seus comportamentos modificados pelas classes filhas, porém eu não posso extender uma classe que representa o carro Eclipse pois a mesma ja tem a sua especialização implementada com as suas próprias especificações, o mesmo vale para a classe final Honda Civic, são casos raros porém bem uteis quando quero abstrair o mundo real no mundo orientado a objetos.

A todos os meus leitores, gostaria que deixassem comentários enviando sugestões, criticas, elogios, e como sempre se algum de vocês detectarem um erro de sintaxe, de lógica, ou de português mesmo deixem nos comentários, criticas são bem vindas, obrigado e abraço a todos !.

quarta-feira, 11 de maio de 2011

Importante ! - Certificações não serão mais pela Prometric

Boa noite pessoal,
No GUJ está rolando uma discussão sobre as certificações Oracle, os centros de testes não serão mais Prometric, porém pela Person Vue.
mais informações pelo
http://www.guj.com.br/java/240618-certificacoes-da-oracle-nao-serao-mais-pela-prometric

Abraços.

Café com Java 21/05

Boa noite pessoal,
como um usuário presente do GUJ (forum de usuários Java) é a minha obrigação divulgar o encontro Café com Java que ocorre Bimestralmente em SP, falamos geralmente de assuntos relacionados a TI, Java, jogamos conversa fora, fazemos network e etc.. é muito bacana para quem quer se entrosar com o pessoal do forum, organizado pelo Eduardo Bregaida, e com o auxilio do Marky Vasconcellos, o encontro se tornou reconhecido,
eu recomendo, fica o link para mais infos.

http://guj.com.br/java/240094-cafe-com-java-2105---sp


Abraços a todos.

Um Pouco Sobre Abstração e Finalização de Classes Pt. 1

Um Pouco Sobre Abstração e Finalização de Classes (vulgos abstract, final)

Em um contexto bem simples podemos dizer que classes abstratas tem duas principais caracteristicas:

  1. É uma classe que não pode ser instanciada
  2. É uma classe que DEVE ser herdada
uma classe abstrata não pode ser instanciada, por quê quando você diz que ela é abstrata você está afirmando que a classe pode não estar pronta para execução, ou melhor dizendo que a classe não foi implementada, vou dar um exemplo:

public abstract class Carro{
    protected String cor;
    protected String modelo;
    protected String chassi;

    public void setCor(String cor);
    public void setModelo(String modelo);
    public void sobeRua(double velocidade);
    public void acelera();   
}

podemos reparar que nos temos a nossa classe carro com varios atributos: Cor, Modelo, Chassi, e com varias operações: setCor(), setModelo(), sobeRua() e acelera(), e se olharmos com mais atenção podemos ver que os metodos declarados não terminam do jeito convencional, com (Curly Braces) Chaves { },
estou dizendo que os métodos existem porém ainda não foram implementados e qualquer classe que extender da classe Carro vai ser OBRIGADA a implementar esses métodos por meio de @override (Sobrescrita), veremos mais a frente no capitulo de sobrescritas e sobreposição de comportamento. Mais outra caracteristica de uma classe abstrata é que eu posso definir métodos não abstratos, e já implementados ! segue um exemplo:

public abstract class Carro{
    //outros métodos e atributos importantes
    public void frearCarro(){
       //rotina de frear
    }
}

Conclusão:

Uma classe abstrata é uma abstração de uma classe real, ou seja uma abstração do que eu desejo levar para o mundo digital para que no futuro eu possa transformar em outro objeto que utiliza os mesmos métodos e atributos, uma classe abstrata Carro no futuro pode ter uma filha CarroBMW (que acelera mais) e implementa o próprio código para acelerar, ou um CarroFusca (que tem mais força e menos aceleração) e que do mesmo jeito implementa o próprio código para acelerar.
Isso acaba sendo muito importante para o Polimorfismo que veremos em outros posts.

E como digo sempre, caso meus leitores vejam algum erro nas minhas lógicas ou de sintaxe ou mesmo de grafia portuguesa, por favor deixem um comentario que terei o prazer de pesquisar mais sobre e acertar o que está errado ou não.

Obrigado e abraço a todos.