Pessoal, não entendi direito pra que serve uma classe anonima, porque usar e como chamar os métodos de uma classe interna anonima?
Classes anônimas são uma gambi para tentar cobrir a falta de closures.
Seja mais claro, não entendi. O que são closures ?
Obrigado pelo link mas eu ja havia lido-o. Mesmo assim não entendi direito.
Diego, uma classe anonima aumenta a flexibilidade. Imagine que você quer uma Thread que tenha um comportamento especifico e que só vai ser usada em determinado método ? Como seria o mais correto, criar uma outra classe? Não, a resposta é Usar Inner Class.
public void especifico (){
Thread thread = new Thread(){public void run(){System.out.print("comportamento");}};
}
Também são bem comuns em interfaces gráficas quando é necessário acessar os dados da classe pai, como no seguinte exemplo (inútil, diga-se de passagem):
public class TestFrame extends JFrame {
private int clickCount = 0;
private JLabel lbCount = new JLabel();
private JButton btIncr = new JButton("Incrementar");
private JButton btMostrar = new JButton("Mostrar");
public static void main(String[] args) {
new TestFrame().setVisible(true);
}
public TestFrame () {
super("Teste");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 300);
setLayout(new FlowLayout());
add(lbCount);
add(btIncr);
add(btMostrar);
btIncr.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
clickCount ++;
}
});
btMostrar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
lbCount.setText(Integer.toString(clickCount));
}
});
}
}
Nesse caso, duas classes anônimas foram criadas, cada uma implementando um ActionListener diferente. O código fica mais limpo em alguns casos, mas tem gente que não gosta.
Falando de uma visão macro em uma calculadora por exemplo…
Se você usar swing você vai ter criar uma classe para cada botão que implemente ActionListener este é o evento de quando você clica no botão;
Com uma classe interna anônima você pode fazer tudo isso dentro da mesma classe criando uma classe anônima que implementa actionListener para cada botão "ou seja dando funcionalidade a cada botão e ainda por cima tem acesso a classe pai.
Se você não usa swing ou threads dificilmente vai usar este recurso.
Para te facilitar se realmente quiser entender como funciona, tenta criar um calculadora na mão sem usar o netbeans ou eclipse, utilizando swing.
Foi o que fiz para poder entender de verdade.
[quote=Diabo Loiro]Falando de uma visão macro em uma calculadora por exemplo…
Se você usar swing você vai ter criar uma classe para cada botão que implemente ActionListener este é o evento de quando você clica no botão;
Com uma classe interna anônima você pode fazer tudo isso dentro da mesma classe criando uma classe anônima que implementa actionListener para cada botão "ou seja dando funcionalidade a cada botão e ainda por cima tem acesso a classe pai.
Se você não usa swing ou threads dificilmente vai usar este recurso.
Para te facilitar se realmente quiser entender como funciona, tenta criar um calculadora na mão sem usar o netbeans ou eclipse, utilizando swing.
Foi o que fiz para poder entender de verdade.[/quote]
Mas em vez de usar uma classe anonima, porque não usar uma innerClass?
Por que no caso da calculadora não faz sentido você ficar dando nomes para a classes "inner class " para botões como “0”,“1”,“2”, é muito ter que fazer uma classe para poder fornecer a funcionalidade do botão, por isso que se usa uma classe interna anonima,que é o mais parecido com closures, se java tivesse closures não seria nescessario escrever uma “classe inteira” mesmo que anonima para dar funcionalidade a cada botão como “0”,“1” da calculadora.
Vale lembrar que uma classe tem que ter uma funcionalidade que a faça merecer ser uma classe e no caso os botões de números da calculadora não merecem ser uma classe.
implemente uma calculadora que vai ficar mais claro para vc.
[quote=Diabo Loiro]Por que no caso da calculadora não faz sentido você ficar dando nomes para a classes "inner class " para botões como “0”,“1”,“2”, é muito ter que fazer uma classe para poder fornecer a funcionalidade do botão, por isso que se usa uma classe interna anonima,que é o mais parecido com closures, se java tivesse closures não seria nescessario escrever uma “classe inteira” mesmo que anonima para dar funcionalidade a cada botão como “0”,“1” da calculadora.
Vale lembrar que uma classe tem que ter uma funcionalidade que a faça merecer ser uma classe e no caso os botões de números da calculadora não merecem ser uma classe.
implemente uma calculadora que vai ficar mais claro para vc.[/quote]
Vou implementar por que ainda não ficou claro o porque user e pra que serve, mesmo com tanto exemplos que vcs me deram. Vou terminar aqui o capitulo de classe interna do livro da kathy e depois vo pro use a cabeça java pra ver isso. Eu vi la usando um swing.
Muito obrigado pela atenção D. Loiro
Só para complementar, a questão das Closures, na Wikipedia:
“Uma closure ocorre normalmente quando uma função é declarada dentro do corpo de outra, e a função interior referencia variáveis locais da função exterior.”
Em javascript por exemplo, uma função pode ser passada como argumento para outra, pode ser criada dentro de outra ou em qualquer lugar, praticamente.
Quando isso acontece, a nova função criada, pode acessar todas as coisas que estavam no escopo onde ela foi criada, mesmo que a execução não esteja mais dentro do escopo.
Um exemplo de Javascript:
var f = null;
function funcao1 () {
var x = 10;
function funcao2 () {
alert(x);
}
f = funcao2;
}
funcao1(); // Agora f = funcao2
f(); // mostra dialog com texto '10'
O código acima exemplifica como o escopo da função 2, que estava dentro da função 1 ainda existe, mesmo depois que a função 1 já foi executada - na chamada f();
na última linha. A função 1 já foi executada, mas a variável x continua existindo para a função 2, que é executada através de f.
As inner classes trazem uma idéia parecida para o Java. Uma classe anônima é a mesma coisa, só que sem nome.
Como o Diabo Loiro disse: não é responsabilidade o suficiente para virar uma classe inteira, mas é uma funcionalidade necessária.
[quote=visola]Só para complementar, a questão das Closures, na Wikipedia:
“Uma closure ocorre normalmente quando uma função é declarada dentro do corpo de outra, e a função interior referencia variáveis locais da função exterior.”
Em javascript por exemplo, uma função pode ser passada como argumento para outra, pode ser criada dentro de outra ou em qualquer lugar, praticamente.
Quando isso acontece, a nova função criada, pode acessar todas as coisas que estavam no escopo onde ela foi criada, mesmo que a execução não esteja mais dentro do escopo.
Um exemplo de Javascript:
var f = null;
function funcao1 () {
var x = 10;
function funcao2 () {
alert(x);
}
f = funcao2;
}
funcao1(); // Agora f = funcao2
f(); // mostra dialog com texto '10'
O código acima exemplifica como o escopo da função 2, que estava dentro da função 1 ainda existe, mesmo depois que a função 1 já foi executada - na chamada f();
na última linha. A função 1 já foi executada, mas a variável x continua existindo para a função 2, que é executada através de f.
As inner classes trazem uma idéia parecida para o Java. Uma classe anônima é a mesma coisa, só que sem nome.
Como o Diabo Loiro disse: não é responsabilidade o suficiente para virar uma classe inteira, mas é uma funcionalidade necessária.[/quote]
hmmm… começamos a nos entender!!
gracias amigo.