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.
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
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.
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.
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
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:
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:
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:
f.addCriterion(new Filter.Criterion("SYMBOL", "SUNW"));
f.addCriterion(new Filter.Criterion("SIDE", "BUY"));
.....
if(f.isTrue(someRec)) //do some thing .....