Expressão Lambda - Parte I (Classes anônimas)
Tags: java, todayilearned, braziliandevs, programming
Published: 2021-10-28 23:16:57

Estudando um pouco sobre **Expressão Lambda em Java**, acabei caindo na documentação e, consequentemente, li sobre Classe Anônima. 

Achei legal e resolvi traduzir e tentar resumir:

**Classes anônimas** te permitem criar um código mais conciso. Elas te permitem declarar e instanciar uma classe ao mesmo tempo.

Elas são como **classes locais** exceto pelo fato de que elas não possuem nome.

Recomenda-se que você as utilize caso precise de uma classe local uma única vez.

## Declarando uma classe anônima

Enquanto classes locais são classes declaradas, as classes anônimas são expressões o que significa que você define a classe em outra expressão.

Exemplo:

```java
public class HelloWorldAnonymousClasses {
  
    interface HelloWorld {
        public void greet();
        public void greetSomeone(String someone);
    }
  
    public void sayHello() {
        
        class EnglishGreeting implements HelloWorld {
            String name = "world";
            public void greet() {
                greetSomeone("world");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Hello " + name);
            }
        }
      //classe declarada na inicialização
        HelloWorld englishGreeting = new EnglishGreeting();
        
//classe anônima na inicialização da variável frenchGreeting
        HelloWorld frenchGreeting = new HelloWorld() {
            String name = "tout le monde";
            public void greet() {
                greetSomeone("tout le monde");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Salut " + name);
            }
        };

        //classe anônima na inicialização da variável frenchGreeting
        HelloWorld spanishGreeting = new HelloWorld() {
            String name = "mundo";
            public void greet() {
                greetSomeone("mundo");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Hola, " + name);
            }
        };
//Mesmo efeito no final das constas
        englishGreeting.greet();
        frenchGreeting.greetSomeone("Fred");
        spanishGreeting.greet();
    }

    public static void main(String... args) {
        HelloWorldAnonymousClasses myApp =
            new HelloWorldAnonymousClasses();
        myApp.sayHello();
    }            
}
```

## Sintaxe da classe anônima

Como já mencionado anteriormente, uma classe anônima é uma expressão.

A sintaxe de uma classe anônima é igual a invocação de um **construtor**, exceto pela definição contida no bloco de código.

Considere a instância do objeto frenchGreeting:

```java
HelloWorld frenchGreeting = new HelloWorld() {
            String name = "tout le monde";
            public void greet() {
                greetSomeone("tout le monde");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Salut " + name);
            }
        };
```

A classe anônima consiste no seguinte:

- O operador `new`
- O nome de uma **interface** para implementar ou para estender. No exemplo anterior, a classe anônima está implementando a interface HelloWorld.
- Parênteses que contém os argumentos para um construtor, exatamente igual a instância de uma classe normal. Nota: Quando você implementa uma interface, não tem construtor, então você só usa um par de parênteses igual ao exemplo.
- Um corpo onde se faz a declaração do corpo da classe. Mais especificamente, no corpo, declaração de método são permitidos porém declarações não.

Considerando que a definição de uma classe anônima é ser uma expressão, ela tem que ser parte de uma variável.

Fonte: [Documentação Java](https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html)