Fork me on GitHub

Viagens, opiniões e afins

by Andre Fonseca


Uso do modificador static dentro do Java

Uma coisa que poucas pessoas sabem é que, em Java, podemos usar o modificador estático (static) para classes e que tal fato pode ser bastante util na hora de escrever algumas coisas. Antes de mais, me desculpem os mais avançados em programação, é preciso gastar algumas linhas para explicar o que significa estatico.
Dentro de orientação objeto dependendo da forma que voce declare algo dentro de uma classe, esta “coisa” terá o seu ciclo de vida ligado a classe, ou ao metodo, ou a um bloco, ou ao objeto. Em alguns livros você achará tal explicação como algo instancia do objeto, instancia do metodo, e por ai vai…. Que tal um exemplo para entendermo melhor
Instancia do Objeto
- é algo que vai existir enquanto existir o objeto. Não necessariamente nasce com o objeto mas “morre” com ele e seu valor está atrelado ao objeto.

public class Aluno {
   private String nome;
    Aluno (String val){
      this.nome = val;
   }
}

No Exemplo acima a variavel nome pertence ao objeto. Sendo assim se fizemos:

...
Aluno[] sala12 = new Aluno []{
new Aluno("aluno1"),
new Aluno("aluno2"),
new Aluno("aluno3"),
};
foreach(Aluno aluno in sala12){
 System.out.println(aluno.getNome());
}

Embora façam parte da mesma classe cada um tem seu “nome”, logo a variavel nome pertence ao objeto.
Fazendo uma pequena modificação no codigo da classe Aluno e colocando a variavel nome com o modificador static e executarmos novamente o codigo acima, a saida será o mesmo nome do ultimo setado. Isso porque a variavel deixou ser do contexto do objeto e passou para o dominio da classe; por mais instancias do objeto aluno criadas no processo da JVM, o valor do nome será unico para todas elas

public class Aluno {
   private static String nome;
    Aluno (String val){
      this.nome = val;
   }
}

Seguindo esse mesmo raciocinio podemos explicar o escopo de metodo e bloco…. Mas deixo isso para o pessoal estudar senão vai ficar muito extenso o post.

  • Logo ser estatico ou a função do modificador estatico (static) é de informar ao compilador e executor que aquela variavel, emtodo, ou quaisquer outras coisas são da classe
  • Uma segundo coisa a explicar antes de falarmos de classes estáticas, tipos de classes. Dentro de java voce pode ter os seguintes tipos: top-level e inner classes.

  • Top level classes
  • São as classes comuns: cada classe tem seu arquivo proprio e está inserida dentro de um pacote. SEria como escrever o arquivo Aluno.java e dentro dele especificar a classe Aluno. Esta classe aluno será uma top level. Este tipo de classe não pode ser estatica

  • Inner classes
  • São classes que pertencem a outras classes. São como propriedade de uma classe e declaradas dentro da especificação de uma classe. Elas podem ser anonimas ou locais. Vejam os dois exemplos abaixo:

    okButton.addActionListener( new ActionListener(){
       public void actionPerformed(ActionEvent e){
          dispose();
       }
    });
    ______________________________________________________
    class ListListener implements ItemListener {
          List list;
          public ListListener(List l) {
             list = l;
          }
          public void itemStateChanged(ItemEvent e) {
             String s = l.getItemSelected();
             doSomething(s);
          }
       }
       List list1 = new List();
       list list2 = new List();
       list1.addItemListener(new ListListener(list1));
       list2.addItemListener(new ListListener(list2));
    }

    As classes locais podem ser estaticas. Isso, de acordo como definimos em cima, significa dizer que voce tem uma classe que está definida dentro da outra classe e pertence a ela e não ao objeto que será instanciado dela.
    Exemplo(tirado do artigo da Java world:

    public class Filter {
       Vector criteria = new Vector();
       public addCriterion(Criterion c) {
          criteria.addElement(c);
       }
       public boolean isTrue(Record rec) {
          for(Enumeration e=criteria.elements();
          e.hasMoreElements();) {
             if(! ((Criterion)e.nextElement()).isTrue(rec))
                 return false;
          }
          return true;
       }
       public static class Criterion {
          String colName, colValue;
          public Criterion(Stirng name, String val) {
             colName = name; colValue = val;
          }
          public boolean isTrue(Record rec) {
             String data = rec.getData(colName);
             if(data.equals(colValue)) return true;
             return false;
          }
       }
    }

    E para usar:

    Filter f = new Filter();
    f.addCriterion(new Filter.Criterion("SYMBOL", "SUNW"));
    f.addCriterion(new Filter.Criterion("SIDE", "BUY"));
    .....
    if(f.isTrue(someRec)) //do some thing .....
    Published by Andre Fonseca, on abril 18th, 2009 at 3:35 pm. Filled under: Informática,Java,tutoriaisNo Comments

    Usando using no seu codigo C#

    Um outro dia estava eu e um amigo discutindo sobre linguagem e acabamos por falar sobre a questão do C# possuir o “using”. Ele é uma das coisas interessantes que o C# tem em relação a outras da mesma familia (como Java).
    Para começar é preciso entender que o using tem 2 possiveis usos:

  • criar um apeliado (alias) para um namespace, e assim facilitar o uso das classe dentro dele
  • importar as classes de um determinado namespace; algo parecido com o import do java
  • Um outro uso possível e bem util do keyword é o seguinte: Imaginemos a situação que você tem um Reader de arquivo e vai efetuar a leitura do conteudo:

    StreamReader reade = new StreamReader("teste.txt");
    //vou ler o arquivo agora...
    string msg = "";
    while(!reader.EndOfStream)
    {
          msg << reader.ReadLine();
          cliente.Incremment();
    }
    reader.Close();

    Bom nesse caso, tudo funciona ok… entretanto imagine o caso da classe cliente, por exemplo, ser nula, ou seu metodo de incremment dispare uma exceção. O sistema irá sair do bloco de codigo e não vai fechar o reader. Isso pode gerar diversos problemas futuros como lock do arquivo e etc. Para resolver isso, muitos diriam – “coloca o bloco de codigo dentro de uma estrutura try catch finally”. Excelente, vamos lá:

    try
    {
       StreamReader reade = new StreamReader("teste.txt");
       //vou ler o arquivo agora...
       string msg = "";
       while(!reader.EndOfStream)
       {
          msg << reader.ReadLine();
          cliente.Incremment();
       }
        reader.Close();
    }
    catch(...)
    {
    }
    finally
    {
       reader.Close(); // e quaisquer outros tratamentos
    }

    O código acima garante a robustez, mas, pelo menos para mim, o código fica muito “poluído”. Vamos agora ver um outro uso do using:

    using (StreamReader reade = new StreamReader("teste.txt"))
    {
       //vou ler o arquivo agora...
       string msg = "";
       while(!reader.EndOfStream)
       {
             msg << reader.ReadLine();
             cliente.Incremment();
       }
    }

    Fazendo isso, o interpretador, ao final garantirá o close do Reader. Isso também é valido para Connections (conexão com o banco de dados por exemplo). Isso deixa o codigo bem elegante. Outra coisa que esta clasula garante que o tempo de vida da classe é somente da execução do bloco, ou seja, ele realizará o dispose do objeto assim que terminar ou sair do bloco. Isso ajuda bastante a evitar os memory leaks e deixar seu codigo super elegante e perfomante.
    Aos poucos vou colocar mais tutoriais como este e sobre outras linguagens. Caso tenham duvida podem mandar email ou deixar comentário que tento responder por email ou por meio de um post.

    Published by Andre Fonseca, on abril 17th, 2009 at 10:03 am. Filled under: .NET,Informática,Sem categoriaNo Comments

    Lendo um arquivo permitindo que outro processo ou programa o altere

    Estava escrevendo um sistema no meu trabalho em C# (csharp) onde se conecta ao log de uma aplicação e escreve as linhas deste num panel (winform). A primeira dificuldade foi como poderia permanecer lendo o arquivo de forma continua. Resolvi com o trecho de codigo abaixo:

    ....
    try
    {
          StreamReader reader = new StreamReader (File.OpenRead("<caminho completo do arquivo>"))
          while (true)
          {
               msg = reader.ReadLine();
               ...
         }
    }
    catch(Exception e)
    {
         System.Console.WriteLine(e.Message);
    }

    Bem isso funcionou bem, a questão que ao fazer isso, por padrão o sistema trava o arquivo não permitindo que outro processo possa escrever no documento. Como queria apenas ler e permitir que a aplicação continuasse a escrever seu log, a solução foi, explicitar o a abertura do arquivo, pelo metodo Open, algumas diretivas. Fica mais ou menos assim:

    StreamReader reader = new StreamReader(File.Open("path",FileMode.Open,FileAccess.Read, FileShare.ReadWrite));
    ...

    Isso funcionou legal e me serviu bem pois agora tenho uma ferramenta simples para ficar vendo o log da minha aplicação.

    Published by Andre Fonseca, on abril 14th, 2009 at 11:31 pm. Filled under: .NET,Sem categoriaNo Comments

    Groovy é “JAVA”

    Dando uma olhada no forum do Grails, acabei tendo um ideia sobre oque escrever para vocês. Uma coisa muito corriqueira, para o pessoal que está começando agora e se depara com Groovy, é que a encaram como uma nova linguagem desacoplada de Java. Sei que isso pode ser algo bom, mas ao mesmo tempo, na minha opnião, faz com que o Groovy perca parte do seu encanto.
    A coisa que sempre me atraiu muito no Groovy foi seu parentesco direto com o Java ( ele é feito todo em java e nunca teve a pretensão de substituí-lo e sim de acrescentar coisas). Com isso, me sentia mais confortavel para migrar e nisso acabei tomando gosto e me apaixonando. Hoje, sempre que posso, tento usar o Grooy ou seus filhotes (Grails, gsp, etc.). Voltando ao assunto, devido a este parentesco direto, voce pode escrever uma classe Groovy utilizando usando a sintaxe e padrões JAva, embora isso, de certa forma, não faça sentido. Outra coisa, assim como outras linguagens suportadas pelo BSF (JRuby, Jython, etc), voce pode usar classes Java dentro do seu codigo. Por isso, todo o legado já existente não é perdido.
    Logo, por exemplo, na pergunta que li, caso deseje que seu groovy leia ou crie uma planilha Excel, voce pode usar, tranquilamente, a api POI do apache, embora exista uma implementação de biblioteca que permite a chamada de ActiveX dentro do codigo groovy. A vantagem que vejo da APi POI, é que ela é multiplataforma, e seu codigo servirá para um sistema linux, macos, VMS, ou qualquer outro que permita um JVM. E esta simbiose não para por aí… Voce pode escrever uma camada de apresentação usando GSP (Groovy Server Page – muito legal) para uma aplicação cujo o backend dela está toda em Java, sem necessidade de modificações profundas (para não dizer nenhuma).
    Por isso o titulo do post, embora provocador, ele de certa forma é real… Groovy é JAVA.

    Published by Andre Fonseca, on abril 13th, 2009 at 9:35 pm. Filled under: Groovy,Java2 Comments