Exemplo:
public class TestClass {
public static void main(String[] args) {
TestClass t = new TestClass();
}
private static void testMethod() {
abstract class TestMethod {
int a;
int b;
int c;
abstract void implementMe();
}
class DummyClass extends TestMethod {
void implementMe() {}
}
DummyClass dummy = new DummyClass();
}
}
Eu descobri que o código acima é perfeitamente legal em Java. Tenho as seguintes perguntas.
- Qual é a utilidade de ter uma definição de classe dentro de um método?
- Um arquivo de classe será gerado para
DummyClass
- É difícil para mim imaginar este conceito de uma forma orientada a objetos. Ter uma definição de classe dentro de um comportamento. Provavelmente alguém pode me dizer exemplos equivalentes do mundo real.
- Classes abstratas dentro de um método parecem um pouco malucas para mim. Mas nenhuma interface é permitida. Existe alguma razão por trás disso?
java
class
local-class
fanfarrão
fonte
fonte
Respostas:
Isso é chamado de classe local.
2 é o mais fácil: sim, um arquivo de classe será gerado.
1 e 3 são quase a mesma pergunta. Você usaria uma classe local onde nunca precisaria instanciar uma ou saber sobre os detalhes de implementação em qualquer lugar, exceto em um método.
Um uso típico seria criar uma implementação descartável de alguma interface. Por exemplo, você frequentemente verá algo assim:
Se você precisar criar um monte deles e fazer algo com eles, você pode alterar isso para
Com relação às interfaces: Não tenho certeza se há um problema técnico que torna as interfaces definidas localmente um problema para o compilador, mas mesmo se não houvesse, elas não agregariam valor. Se uma classe local que implementa uma interface local fosse usada fora do método, a interface não teria sentido. E se uma classe local fosse usada apenas dentro do método, a interface e a classe seriam implementadas dentro desse método, portanto, a definição da interface seria redundante.
fonte
parameter
acima pode ser declarado no método envolvente e é acessível por ambos os threads.Essas são chamadas de classes locais . Você pode encontrar uma explicação detalhada e um exemplo aqui . O exemplo retorna uma implementação específica que não precisamos saber fora do método.
fonte
A classe não pode ser vista (ou seja, instanciada, seus métodos acessados sem Reflexão) de fora do método. Além disso, ele pode acessar as variáveis locais definidas em testMethod (), mas antes da definição da classe.
Na verdade, pensei: "Esse arquivo não será gravado." até que eu tentei: Oh sim, esse arquivo é criado! Ela será chamada de algo como A $ 1B.class, onde A é a classe externa e B é a classe local.
Especialmente para funções de retorno de chamada (manipuladores de eventos em GUIs, como onClick () quando um botão é clicado etc.), é bastante comum usar "classes anônimas" - em primeiro lugar, porque você pode acabar com muitas delas. Mas às vezes as classes anônimas não são boas o suficiente - especialmente, você não pode definir um construtor para elas. Nestes casos, essas classes locais do método podem ser uma boa alternativa.
fonte
TestClass$1TestMethodClass.class
, de forma análoga a como os.class
arquivos de classes internas são nomeados.O verdadeiro propósito disso é nos permitir criar classes embutidas em chamadas de função para consolar aqueles de nós que gostam de fingir que estamos escrevendo em uma linguagem funcional;)
fonte
O único caso em que você gostaria de ter uma classe interna de função totalmente desenvolvida versus classe anônima (também conhecida como encerramento de Java) é quando as seguintes condições são atendidas
Por exemplo, alguém deseja um
Runnable
e você deseja registrar quando a execução foi iniciada e encerrada.Com a classe anônima não é possível fazer, com a classe interna você pode fazer isso.
Aqui está um exemplo para demonstrar meu ponto
Antes de usar este padrão, por favor, avalie se a velha e simples classe de nível superior, ou classe interna, ou classe interna estática são alternativas melhores.
fonte
A principal razão para definir classes internas (dentro de um método ou classe) é lidar com a acessibilidade de membros e variáveis da classe e método envolvente. Uma classe interna pode pesquisar membros de dados privados e operar neles. Se estiver dentro de um método, ele pode lidar com a variável local final também.
Ter classes internas ajuda a garantir que essa classe não seja acessível ao mundo externo. Isso é verdadeiro especialmente para casos de programação UI em GWT ou GXT etc, onde o código de geração de JS é escrito em java e o comportamento de cada botão ou evento deve ser definido pela criação de classes anônimas
fonte
Encontrei um bom exemplo na primavera. A estrutura está usando o conceito de definições de classes locais dentro do método para lidar com várias operações de banco de dados de maneira uniforme.
Suponha que você tenha um código como este:
Vejamos primeiro a implementação de execute ():
Observe a última linha. O Spring também faz esse "truque" exato para o resto dos métodos:
O "truque" com as classes locais permite que o framework lide com todos esses cenários em um único método que aceita essas classes por meio da interface StatementCallback. Este método único atua como uma ponte entre as ações (executar, atualizar) e as operações comuns em torno delas (por exemplo, execução, gerenciamento de conexão, tradução de erro e saída do console dbms)
fonte