É possível passar parâmetros ou acessar parâmetros externos para uma classe anônima? Por exemplo:
int myVariable = 1;
myButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// How would one access myVariable here?
}
});
Existe alguma maneira de o ouvinte acessar myVariable ou passar para myVariable sem criar o ouvinte como uma classe nomeada real?
java
anonymous-class
Lewis
fonte
fonte
final
variáveis locais a partir do método anexo.this
.Respostas:
Tecnicamente, não, porque classes anônimas não podem ter construtores.
No entanto, as classes podem fazer referência a variáveis que contêm escopos. Para uma classe anônima, essas podem ser variáveis de instância das classes que contêm ou variáveis locais marcadas como finais.
edit : Como Peter apontou, você também pode passar parâmetros para o construtor da superclasse da classe anônima.
fonte
new ArrayList(10) { }
super()
antes e depois do restante do construtor real.new someclass(){ fields; {initializer} fields; methods(){} }
. É como um inicializador estático, mas sem a palavra-chave estática. docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6Sim, adicionando um método inicializador que retorna 'this' e chamando imediatamente esse método:
Nenhuma declaração 'final' é necessária.
fonte
final
objeto de referência para poder obter informações em minhas classes anônimas. Obrigado por compartilhar!init()
função precisa retornarthis
? Eu realmente não entendo a sintaxe.sim. você pode capturar variável visível para a classe interna. a única limitação é que deve ser final
fonte
this
qual é final.final
? Não consigo encontrar outra alternativa. Isso pode influenciar o parâmetro de origem projetado para serfinal
.Como isso:
fonte
Isso fará a mágica
fonte
Conforme mostrado em http://www.coderanch.com/t/567294/java/java/declare-constructor-anonymous-class, você pode adicionar um inicializador de instância. É um bloco que não tem nome e é executado primeiro (como um construtor).
Parece que eles também são discutidos em Por que inicializadores de instância java? e Como um inicializador de instância é diferente de um construtor? discute as diferenças dos construtores.
fonte
final
variáveis descritas por aav, mas essas informações não foram fornecidas nesta resposta. De longe, a melhor resposta é a dada por Adam Mlodzinksi (agora uso esse padrão exclusivamente, não há mais finais!). Eu mantenho meu comentário de que isso não responde à pergunta.Minha solução é usar um método que retorne a classe anônima implementada. Argumentos regulares podem ser passados para o método e estão disponíveis na classe anônima.
Por exemplo: (de algum código GWT para lidar com uma alteração na caixa de texto):
Para este exemplo, o novo método de classe anônimo seria referenciado com:
OU , usando os requisitos do OP:
fonte
Outras pessoas já responderam que classes anônimas podem acessar apenas variáveis finais. Mas eles deixam a questão em aberto como manter a variável original não final. Adam Mlodzinski deu uma solução, mas é bastante inchada. Existe uma solução muito mais simples para o problema:
Se você não quiser
myVariable
ser final, precisará envolvê-lo em um novo escopo, onde isso não importa, se for final.Adam Mlodzinski não faz mais nada em sua resposta, mas com muito mais código.
fonte
init
método. Eu posso adicionar uma linha de código adicional ao meu exemplo para ter essa variável adicional. Se você é um grande fã de padrões de construtores, sinta-se à vontade para usá-los, mas eles não são necessários neste caso.final
solução variável.Você pode usar lambdas simples ("expressões lambda podem capturar variáveis")
ou mesmo uma função
Usar a Função é uma ótima maneira de refatorar decoradores e adaptadores, veja aqui
Acabei de começar a aprender sobre lambdas, por isso, se você encontrar um erro, fique à vontade para escrever um comentário.
fonte
Uma maneira simples de colocar algum valor em uma variável externa (não pertence à classe anonymus) é como segue!
Da mesma forma, se você deseja obter o valor de uma variável externa, pode criar um método que retorne o que deseja!
fonte
Eu pensei que classes anônimas eram basicamente como lambdas, mas com sintaxe pior ... isso acaba sendo verdade, mas a sintaxe é ainda pior e faz com que (o que deveria ser) variáveis locais vazem na classe que o contém.
Você não pode acessar nenhuma variável final transformando-a em campos da classe pai.
Por exemplo
Interface:
classe:
Eu não sei se eles resolveram isso em java 8 (eu estou preso no mundo EE e ainda não tenho 8), mas em c # ficaria assim:
Você não precisa de uma interface separada em c # também ... Eu sinto falta! Eu me pego criando designs piores em java e me repetindo mais porque a quantidade de código + complexidade que você precisa adicionar em java para reutilizar algo é pior do que apenas copiar e colar a maior parte do tempo.
fonte