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.

quarta-feira, 9 de fevereiro de 2011

Sem posts por enquanto

Olá galera, estamos sem posts por enquanto,
tentaremos trazer mais conteudo no próximo mês quando eu tirar a certificação XD

terça-feira, 18 de janeiro de 2011

2 Tópico da Prova - Estruturas de Fluxo de Dados

Boa noite galera, um pouco de estruturas de fluxo de dados começando pela estrutura mais básica de todas o IF ( Se )

e para que serve o if ? o if serve principalmente para verificar se uma condição é verdadeira ou não, existem muitas pegadinhas na prova que utilizam o IF vamos começar do começo (first things first)








estrutura básica do if

if ( condição ) {

}

bem simples não acham?
lembrando que :
a condição sempre SEMPRE SEMPRE ! tem que ser um valor booleano, no Java existem operadores de comparações que retornam booleano e que podem ser usados em estruturas de IF's










operadores de condições:

== (igual, igual) compara se uma condição é igual a outra
!= (diferente, igual) compara se uma condição é diferente da outra
> (maior) compara se uma condição é maior que a outra (numeros somente)
< (menor) compara se uma condição é menor que a outra (numeros somente)
<= (menor, igual) compara se uma condição é menor ou igual a outra (numeros somente)
>= (maior, igual) compara se uma condição é maior ou igual a outra (numeros somente)

você pode utilizar quaisquer desses operadores na sua condição IF
escreva algum código Java na sua IDE favorita para fazer testes com if, é vital lembrar dessas informações

pegadinhas:








Se vocês repararem vão ver a linha do IF Grifada em vermelho, cuidado com os operadores de comparação e operadores de atribuição ou seja o = (igual) é um operador de atribuição na verdade o que você está falando na condição é idade igual a 10












E por quê esse código não tem problema nenhum???????
dessa vez reparem que estou utilizando uma variavel do tipo boolean que é true ou false
isso funciona, uma vez que condição é um boolean, tanto faz se você utilizar o operador de atribuição porém o resultado sempre será um boolean (valido para um if) ou seja o nosso if ira realizar o "//do something"

se ficou alguma dúvida por favor deixem comentarios, se errei por favor comentem também
obrigado a todos.

Escopo de visibilidade de código

Boa noite galera estou aqui hoje para falar um pouco sobre visibilidade de código

o que vocês acham desse código ?







bom a variavel idade está marcada em vermelho pois o java não consegue visualizar a variavel idade.

"MAIS COMO ISSO???? TÁ LA NA LINHA 4 INICIALIZEI!"

Em qualquer linguagem que eu conheça é claro kkk
utiliza escopo de variaveis, alguem conheçe aquele ditado : "O que acontece em quatro paredes fica em quatro paredes" ?.
então no Java é bem parecido toda variavel que é inicializada dentro de um laço uma estrutura de condição etc.. fica dentro da mesma

exemplo:

variaveis que são inicializadas dentro de IF's e Elses são somente visiveis dentro das mesmas
variaveis que são inicializadas dentro de Fors, Whiles, For Eachs, Do Whiles, Switch's etc.. são somente visiveis dentro das mesmas

isso também é pegadinha da prova, então cuidado sempre estude.!

como sempre eu reforço, sou um programador humano como todos os meus leitores, caso eu tenha escrito algo errado ou tenha faltado alguma coisa em algum de meus artigos, por favor deixem comentarios.
Obrigado a todos.

quinta-feira, 13 de janeiro de 2011

Post pequeno de quinta feira pós pastel

Bom dia pessoal,
uma pequena dica para aqueles que almejam a OCJP
Estudem muito ! e usufruam de simulados, ai vai um para aqueles que estão começando

O Java Ranch.com (em inglês)

O Java ranch tem um forum muito util, e um simulado muito amigavel
Simulado
e outra dica é acompanhe o GUJ grupo de usuários Java www.guj.com.br
muito util para tirar dúvidas.

quarta-feira, 12 de janeiro de 2011

Um pouco sobre inicialização de variaveis

Um pequeno post sobre inicialização de variaveis

deve-se tomar cuidado com inicializações pois devemos dizer ao Java de algum jeito que iremos utilizar aquela variavel ou seja

caso você crie o seguinte método:



O Java ira acusar um erro pois a variavel idade não foi inicializada, e o Java encherga isso em tempo de compilação. Existem dois jeitos corretos de se fazer isso

1 - carregando a variavel com um valor default (de sua preferencia) -1 por exemplo




2 - ou tendo um atributo de classe (ou uma variavel membro de classe se preferir)


Eu posso fazer isso pois variaveis de classe são instanciadas automáticamente

Essa regra não se aplica a parametros já que todos os parametros passados precisam obrigatoriamente ser criados.

lembrando mais uma vez, caso algum de meus posts tenha algum defeito gostaria que meus leitores me deixassem um comentario para que possa concertar meus posts.

terça-feira, 11 de janeiro de 2011

Definições Pascal Case e Camel Case

Vou explicar o que é Pascal Case e o que é Camel Case
é bem simples

o padrão Pascal Case é muito utilizado para nomear metodos em C# e em Delphi
e utiliza esse padrão de nomenclatura

palavras iniciadas com letra maiuscula

Ir();

caso seja um metodo composto por mais palavras seria

IrParaCasa();

sempre respeitando que as palavras seguintes a primeira começam com maiusculo e são unidas com a primeira palavra

Camel Case

O camel case é muito utilizado no Java,
variaveis e metodos devem ser nomeados com o seguinte padrão

ir();

para duas palavras utilizar:

irParaCasa();

eu como programador Java gosto muito de utilizar o camel case, mais vai de cada programador ou do padrão de cada empresa

isso significa manter um padrão de nomenclaturas que facilita a leitura do código para outros programadores que vão realizar manutenção do seu código



Happy Coding XD

Fundamentos de um programador Java certificado

A coisa mais básica para se aprender no estudo da certificação é como declarar corretamente variaveis, respeitando as regras de nomenclatura do Java, e o que seriam as regras de nomenclatura de variaveis do Java ? antes de aprendermos devemos ter em mente quais são as palavras reservadas do Java 1.6 para não cometer nenhum erro na codificação.

palavras chave do Java (lembrando que todas começam com letra minuscula)

while, switch, synchronized, this, throw, throws, transient, try, void, volatile, new, package, private, public, protected, return, short, static, strictfp, super, for, goto, if, implements, import, instanceof, int, interface, long, native, continue, default, do, double, else, enum, extends, final, finally, float, abstract, assert, boolean, break, byte, case, catch, char, class, const

a regra diz que :

nomes de variaveis podem começar com caracteres especiais: $ e _
nomes de variaveis podem ser camelCase ou PascalCase (definição) ou até AnyCase (int NuMeRoDeCaSa) além de não recomendar a ninguem kkkkk. mais funciona.
nomes de variaveis não podem começar com numeros 123 ex: 1_cliente;
nomes de variaveis não podem ser iguais as palavras chaves comentadas acima

tome cuidado porém existem pegadinhas na prova que incluem variaveis escritas de um jeito diferente que podem te confundir na hora da prova por ex: int N34_NomenHEjdhs;
sim isso é valido. por tanto pratique na sua IDE favorita

seguindo essas regras será possivel garantir que seu código compile corretamente
lembre-se na hora de programar você pode ter uma IDE que te ajude Eclipse, NetBeans, etc.. porém na hora da prova o código vai ser exibido em um bloco de texto sem cores para distinguir nomenclaturas de texto, então cuidado pratique sempre que puder.

Tópicos da SCJP - OCP

Olá pessoal, neste post vou explicar um pouco dos tópicos da SCJP versão 6.0
que estão descritos neste site
aqui


E ao longo do tempo vou criando posts descrevendo cada tópico e vou colocando um link para cada um aqui neste mesmo post.

Tópicos cobrados na prova:

1-  Declarações, Inicializações e Escopo de código
      - Declarações de variaveis, escopo de visibilidade ou seja onde as variaveis são visiveis dentro de um código e inicializações obrigatorias para compilar seu código.

2 - Controle de fluxo de dados
      - Controle de decisões lógicas utilização de blocos, IF, ELSE, SWITCH, etc..

3 - Conceitos de API
      - Utilização de Wrapping, Boxing e Unboxing, diferenças entre Strings mutaveis e não mutaveis, ler e escrever arquivos, classes de funcionalidade para Parsear datas, numeros, e o uso correto do Locale do Java, e por fim como utilizar o pacote Regex (meu favorito e mto dificil) para verificar expressões regulares

4 - Concorrência
      - Como criar novas Threads de execução utilizando java.lang.Thread e java.lang.Runnable
      - Reconher os estados em que uma Thread pode existir e identificar meios em que cada Thread pode transitar de um estado para outro
      - Dado um cenario escrever um código que faz uso apropriado de locking de objetos para protejer blocos estaticos ou de instancia de problemas de acessos de concorrência.

 5 - Conceitos de Orientação a Objetos
       - Desenvolver um código que implementa encapsulamento, baixo acoplamento, e alta coesão em classes e descrever seus beneficios
      - Dado um cenario desenvolver código que usa polimorfismo, determinar quando casting será necessário e reconhecer erros de Compilador e erros de Runtime relacionados com Casting de referencias
     - Explicar efeitos dos modificadores de acesso nas heranças com respeito a construtores, instancias ou variaveis estáticas
    - Dado um cenario desenvolver código que declara ou invoca metodos sobreescritos ou sobrecarregados e código que declara e/ou invoca superclasses ou construtores sobrecarregados
    - Desenvoler códigos que implementam relacionamentos "is-a" ("é um") e ou "has-a" ("tem um")

6 - Coleções / Generics
      - Dado um cenario, determinar quais coleções devem ser usadas apropriadamente para implementar aquele design especifico, incluindo o uso da interface Comparable (muito importante)
      - Destinguir entre sobrescritas corretas e incorretas do método hashCode e do método equals e explicar a diferença entre == e o método equals
      - Escrever códigos que usam versões genericas da Collections API, em particular, as interfaces Set, List e Map e suas classes de implementação. Reconheçer limitações de coleções não genericas e como refatora-las em coleções genericas, e por fim escrever código que utiliza as interfaces NavigableSet e NavigableMap  (novo na versão 1.6 da prova)
      - Desenvolver códigos que fazem uso correto de tipos de paramêtros de declaração em classe/interfaces, instancia de variaveis, argumentos de métodos, e tipos de retorno, e escrever código métodos genéricos ou métodos que fazem usos de tipos "Wildcard" (tipos Coringa) e entender similaridades e diferenças entre essas duas abordagens
      - Usar as capacidades do pacote java.util para escrever código que efetua sorting em listas, criando uma busca binaria, ou convertendo uma lista para um array, usar capacidades do pacote para escrever código para fazer sorting de arrays utilizando uma busca binaria ou convertendo array para lista, usar as interfaces Comparator e Comparable para afetar sorting de listas e arrays, e mais pra frente reconhecer o efeito da ordenação natural de classes wrappers primitivas e Strings nos sortings

7 - Fundamentos
     - Dado um exemplo de código e um cenário, escrever códigos que usam apropriadamente modificadores de acesso, declaração de pacotes e imports para interagir com (atravez de acesso ou herança) o código no exemplo
     - Dado um exemplo de classe e uma linha de comando, determinar o comportamento experado de runtime
     - Determinar o efeito sobre uma referencia de objeto e valores primitivos quando são passados para metodos que fazem mudanças nos paramêtros.
     - Dado um exemplo de código reconhecer o ponto em que um objeto se torna elegivel para o GC (garbage collection) e determinar o que é e o que não é garantido pelo sistema de GC, e reconhecer os comportamentos do método Object.finalize()
     - Dado um full-qualified name de uma classe o que é compilado dentro ou fora do arquivo Jar, construção apropriada de uma estrutura de diretorio para aquela classe. Dado um exemplo de código e um classpath, determinar quando o classpath irá permitir o código compilar com sucesso.
     - Escrever um código que aplica corretamente operadores incluindo operadores de atribuição, aritiméticos, e relacionais, o operador instanceOf, operadores lógicos e o operador condicional  para produzir o resultado desejado.
     - Escrever um código que determina equalidade de dois objetos ou primitivos.

segunda-feira, 10 de janeiro de 2011

Um pouco de tudo

Meu objetivo em escrever esse blog é me aperfeiçoar nos estudos da OCJP e conseguir finalmente a minha certificação Java, não sou expecialista mais estou me esforçando para ser pretendo escrever a maioria dos tópicos importantes da OCJP e gostaria que meu blog seja de grande ajuda para todos aqueles que também desejam ser um dia programadores certificados. abraços a todos