Quando usar Classes aninhadas, classes locais, classes anônimas e expressões lambdas
Tags: java, todayilearned, braziliandevs, tutorial
Published: 2022-02-09 22:35:46

##Classe aninhada

O **Java** te permite definir uma classe dentro de outra. Exemplo:

```java
class ClasseExterna {
    ...
    class ClasseAninhada {
        ...
    }
}
```

Classes aninhadas te permitem ter lógica de grupo de classes que vocês está utilizando em um único lugar, o ponto positivo é que esse tipo de recurso aumento o encapsulamento, cria um código mais legível e melhora a manutenção do código.

Já as classes locais, classes anônimas e expressões lambdas também dão os mesmo benefícios, porém são recomendadas para usos mais específicos.

##Classe local

Classes locais são aquelas que você define dentro do bloco. Você normalmente encontra classes locais definidas dentro de corpo de métodos.

```java
public class ExemploClasseLocal {
  
    static String regularExpression = "[^0-9]";
  
		//Método que precisamos
    public static void validarTelefone(
        String telefone1, String telefone2) {
      
        final int tamanhoTelefone = 10;
       
				//Criamos uma classe para poder implementar a lógica de validação do telefone
        class NumeroTelefone {
            
            String numeroTelefoneFormatado = null;

            PhoneNumber(String numeroTelefone){

                String numeroAtual = numeroTelefone.replaceAll(
                  regularExpression, "");
                if (numeroAtual.length() == tamanhoTelefone)
                    numeroTelefoneFormatado = numeroAtual;
                else
                    numeroTelefoneFormatado = null;
            }

            public String getNumero() {
                return numeroTelefoneFormatado;
            }
           

        NumeroTelefone numero1 = new NumeroTelefone(telefone1);
        NumeroTelefone numero2 = new NumeroTelefone(telefone2);

        if (numero1.getNumero() == null) 
            System.out.println("Primeiro número é inválido");
        else
            System.out.println("Primeiro número é " + numero1.getNumero());
        if (numero2.getNumber() == null)
            System.out.println("Segundo número é inválido");
        else
            System.out.println("Segundo número é  " + numero2.getNumero());

    }

		//Chamando o nosso método de validação de telefone
    public static void main(String... args) {
        validarTelefone("123-456-7890", "456-7890");
    }
}
```

Use caso você precise criar mais de uma instância da classe, acessar seu construtor ou criar um novo.

##[Classe Anônima](https://dev.to/diariodeumacdf/expressao-lambda-parte-i-classes-anonimas-1adc)

Use caso você precise declarar campos ou adicionar métodos.

##[Expressão Lambda](https://dev.to/diariodeumacdf/expressao-lambda-parte-ii-quando-e-como-usar-efm)

Use caso você esteja encapsulando um único comportamento que você quer passar para outro trecho de código. Por exemplo, você pode usar expressão lambda se você quer que determinada ação performe em cada elemento de uma **collection** quando o processo está completo ou quando o processo encontra algum erro.

Você também pode usar caso precise de uma única instância de uma **interface funcional** e você não precisa de nada muito completo (exemplo: você não precisa de construtor, um nome tipado, campos ou métodos adicionais).

Fonte traduzida livremente: [https://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html](https://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html)