Qual é o uso de classes anônimas em Java? Podemos dizer que o uso de classe anônima é uma das vantagens do Java?
java
anonymous-class
anonymous-inner-class
Guerreiro
fonte
fonte
Respostas:
Por uma "classe anônima", entendo que você quer dizer classe interna anônima .
Uma classe interna anônima pode ser útil ao criar uma instância de um objeto com certos "extras", como métodos de substituição, sem ter que realmente subclassificar uma classe.
Eu costumo usá-lo como um atalho para anexar um ouvinte de evento:
O uso desse método torna a codificação um pouco mais rápida, pois não preciso criar uma classe extra que implemente
ActionListener
- posso instanciar uma classe interna anônima sem criar uma classe separada.Eu só uso essa técnica para tarefas "rápidas e sujas", onde fazer uma aula inteira parecer desnecessária. Ter várias classes internas anônimas que fazem exatamente a mesma coisa deve ser refatorada para uma classe real, seja uma classe interna ou uma classe separada.
fonte
overloading methods
e nãooverriding methods
?Classes internas anônimas são efetivamente encerramentos, portanto podem ser usadas para emular expressões lambda ou "delegados". Por exemplo, considere esta interface:
Você pode usar isso anonimamente para criar uma função de primeira classe em Java. Digamos que você tenha o seguinte método que retorna o primeiro número maior que i na lista fornecida, ou i se nenhum número for maior:
E então você tem outro método que retorna o primeiro número menor que i na lista fornecida, ou i se nenhum número for menor:
Esses métodos são quase idênticos. Usando a função de primeira classe tipo F, podemos reescrevê-los em um método da seguinte maneira:
Você pode usar uma classe anônima para usar o método firstMatch:
Este é um exemplo realmente elaborado, mas é fácil ver que poder transmitir funções como se fossem valores é um recurso bastante útil. Veja "Sua linguagem de programação pode fazer isso", do próprio Joel.
Uma boa biblioteca para programar Java neste estilo: Java funcional.
fonte
Classe interna anônima é usada no seguinte cenário:
1.) Para Substituir (Subclassificação), Quando a definição de classe não é utilizável, exceto no caso atual:
2.) Para implementar uma interface, quando a implementação da interface é necessária apenas para o caso atual:
3.) Classe interna anônima definida por argumento:
fonte
Às vezes, eu os uso como um hack da sintaxe para a instanciação do mapa:
vs
Isso economiza redundância ao fazer várias declarações put. No entanto, também encontrei problemas ao fazer isso quando a classe externa precisa ser serializada via comunicação remota.
fonte
Eles são comumente usados como uma forma detalhada de retorno de chamada.
Suponho que você possa dizer que são uma vantagem em comparação a não tê-las e ter que criar uma classe nomeada todas as vezes, mas conceitos semelhantes são implementados muito melhor em outros idiomas (como fechamentos ou blocos)
Aqui está um exemplo de swing
Embora ainda seja confuso, é muito melhor do que forçar você a definir uma classe nomeada para cada ouvinte que joga fora isso (embora, dependendo da situação e reutilização, essa ainda seja a melhor abordagem)
fonte
myButton.addActionListener(e -> { /* do stuff here */})
oumyButton.addActionListener(stuff)
seria terser.Você o usa em situações em que precisa criar uma classe para uma finalidade específica dentro de outra função, por exemplo, como ouvinte, como executável (para gerar um encadeamento), etc.
A idéia é que você os chame de dentro do código de uma função para nunca consultá-los em outro lugar, para não precisar nomeá-los. O compilador apenas os enumera.
Eles são essencialmente açúcar sintático e geralmente devem ser movidos para outro lugar à medida que crescem.
Não tenho certeza se essa é uma das vantagens do Java, mas se você as usar (e todas as usamos com frequência, infelizmente), poderá argumentar que elas são uma.
fonte
GuideLines para classe anônima.
A classe anônima é declarada e inicializada simultaneamente.
A classe anônima deve estender ou implementar para uma e apenas uma classe ou interface resp.
Como a classe anonymouse não tem nome, ela pode ser usada apenas uma vez.
por exemplo:
fonte
ref.getClass().newInstance()
.Sim, classes internas anônimas são definitivamente uma das vantagens do Java.
Com uma classe interna anônima, você tem acesso às variáveis finais e membros da classe circundante, o que é útil para os ouvintes, etc.
Mas uma grande vantagem é que o código da classe interna, que é (pelo menos deve ser) fortemente acoplado à classe / método / bloco circundante, tem um contexto específico (a classe, o método e o bloco circundantes).
fonte
Este também é um exemplo de tipo interno anônimo usando thread
fonte
eu uso objetos anônimos para chamar novos threads.
fonte
Uma classe interna está associada a uma instância da classe externa e existem dois tipos especiais: Classe local e classe Anônima . Uma classe anônima nos permite declarar e instanciar uma classe ao mesmo tempo, tornando o código conciso. Nós os usamos quando precisamos de uma classe local apenas uma vez, pois eles não têm nome.
Considere o exemplo do doc em que temos uma
Person
classe:e temos um método para imprimir membros que correspondem aos critérios de pesquisa como:
Onde
CheckPerson
está uma interface como:Agora podemos usar a classe anônima que implementa essa interface para especificar critérios de pesquisa como:
Aqui a interface é muito simples e a sintaxe da classe anônima parece pesada e pouco clara.
O Java 8 introduziu um termo Interface Funcional, que é uma interface com apenas um método abstrato; portanto, podemos dizer que
CheckPerson
é uma interface funcional. Podemos fazer uso da expressão Lambda, que nos permite passar a função como argumento do método como:Podemos usar uma interface funcional padrão
Predicate
no lugar da interfaceCheckPerson
, o que reduzirá ainda mais a quantidade de código necessária.fonte
A classe interna anônima pode ser benéfica ao fornecer implementações diferentes para objetos diferentes. Mas deve ser usado com moderação, pois cria problemas para a legibilidade do programa.
fonte
Um dos principais usos de classes anônimas na finalização de classe, chamada de finalizador guardião . No mundo Java, os métodos finalize devem ser evitados até que você realmente precise deles. Lembre-se de que, quando você substitui o método finalize para subclasses, sempre deve invocá-lo
super.finalize()
, porque o método finalize da superclasse não invocará automaticamente e você pode ter problemas com vazamentos de memória.portanto, considerando o fato mencionado acima, você pode simplesmente usar as classes anônimas como:
Ao usar essa técnica, você e seus outros desenvolvedores se livraram de chamar
super.finalize()
cada subclasse doHeavyClass
método que precisa finalizar.fonte
Você pode usar classe anônima dessa maneira
fonte
Parece que ninguém foi mencionado aqui, mas você também pode usar a classe anônima para armazenar argumentos de tipo genérico (que normalmente são perdidos devido ao apagamento do tipo) :
Se você instanciar essa classe de maneira anônima
essa
holder
instância conterá uma definição não apagada do tipo passado.Uso
Isso é muito útil para criar validadores / desserializadores. Além disso, você pode instanciar o tipo genérico com reflexão (por isso, se você quiser fazer
new T()
no tipo parametrizado - seja bem-vindo!) .Desvantagens / Limitações
fonte
A melhor maneira de otimizar o código. Além disso, podemos usar o método de substituição de uma classe ou interface.
fonte
Uma classe interna anônima é usada para criar um objeto que nunca será referenciado novamente. Ele não tem nome e é declarado e criado na mesma instrução. Isso é usado onde você normalmente usaria a variável de um objeto. Você substitui a variável pela
new
palavra - chave, uma chamada para um construtor e a definição de classe dentro{
e}
.Ao escrever um programa encadeado em Java, normalmente seria assim
O
ThreadClass
usado aqui seria definido pelo usuário. Esta classe implementará aRunnable
interface necessária para criar threads. NoThreadClass
orun()
método (único métodoRunnable
) precisa ser implementado também. É claro que se livrarThreadClass
seria mais eficiente e é exatamente por isso que existem Classes Internas Anônimas.Veja o seguinte código
Este código substitui a referência feita
task
no exemplo mais importante. Em vez de ter uma classe separada, a Classe Interna Anônima dentro doThread()
construtor retorna um objeto sem nome que implementa aRunnable
interface e substitui orun()
método. O métodorun()
incluiria instruções internas que fazem o trabalho exigido pelo encadeamento.Respondendo à pergunta sobre se Anonymous Inner Classes é uma das vantagens do Java, devo dizer que não tenho muita certeza, pois não estou familiarizado com muitas linguagens de programação no momento. Mas o que posso dizer é que é definitivamente um método mais rápido e fácil de codificar.
Referências: Sams ensina-se Java em 21 dias sétima edição
fonte
Mais uma vantagem:
como você sabe que Java não suporta herança múltipla, por isso, se você usar a classe "Thread" como classe anônima, a classe ainda terá um espaço restante para qualquer outra classe estender.
fonte