AULA 05 MÓDULO 1 métodos java ⏱ 50 min

Métodos e Responsabilidade

Tell, Don't Ask: o objeto executa, não expõe. Métodos de instância vs estáticos. Scanner para entrada. Boas práticas de nomenclatura.

Tell Don't AskstaticinstânciaScannerMathString.format

Tell, Don't Ask

Princípio fundamental: diga ao objeto O QUE FAZER, não pergunte seus dados para decidir por ele. Objetos são responsáveis pelo próprio comportamento.

errado — Ask
if (conta.getSaldo() > valor) { conta.setSaldo(conta.getSaldo() - valor); }
Código externo lê o saldo, decide, e modifica. Lógica de negócio vazou para fora da classe.
certo — Tell
conta.sacar(valor);
A conta decide se pode sacar, executa a operação e lança exceção se não puder. Toda a lógica fica encapsulada na classe.

Tipos de métodos

Métodos de instância operam sobre o estado do objeto. Métodos estáticos são utilitários — não dependem de estado de instância.

TipoAcessa this?Quando usarExemplo
Instância✓ simComportamento que usa/modifica estadoconta.depositar(100)
Estático✗ nãoUtilitário independente do estadoMath.sqrt(4)
Estático factory✗ nãoCriação de objetos com nome semânticoPedido.urgente(cliente)
💡
métodos com bom nome
Nome = verbo + complemento. calcularArea(), validarEmail(), gerarCodigo(). Nunca: metodo1(), processa(), faz(). O nome é documentação.

Scanner — entrada do usuário

Scanner lê dados do teclado ou de arquivos. Sempre feche com scanner.close() ou use try-with-resources.

⚠️
nextLine() após nextInt()
Após scanner.nextInt(), há um '\n' residual no buffer. Chame scanner.nextLine() vazio antes do próximo nextLine() para consumir o resíduo. Erro clássico de iniciante em Java.
java
// Métodos — Tell Don't Ask em ação

public class Triangulo {
    private final double a, b, c;

    public Triangulo(double a, double b, double c) {
        if (!validar(a, b, c))
            throw new IllegalArgumentException("Lados inválidos para triângulo");
        this.a = a; this.b = b; this.c = c;
    }

    // Método estático — utilitário independente de estado
    public static boolean validar(double a, double b, double c) {
        return a > 0 && b > 0 && c > 0
            && a+b > c && a+c > b && b+c > a;
    }

    // Método de instância — usa estado do objeto
    public double calcularPerimetro() { return a + b + c; }

    // Fórmula de Heron — área sem saber a altura
    public double calcularArea() {
        double s = calcularPerimetro() / 2;
        return Math.sqrt(s * (s-a) * (s-b) * (s-c));
    }

    public String toString() {
        return String.format("Triângulo(%.1f,%.1f,%.1f) área=%.2f", a, b, c, calcularArea());
    }
}

// Scanner com try-with-resources
try (Scanner sc = new Scanner(System.in)) {
    System.out.print("Lado a: ");
    double a = sc.nextDouble();
    System.out.print("Lado b: ");
    double b = sc.nextDouble();
    System.out.print("Lado c: ");
    double c = sc.nextDouble();
    System.out.println(new Triangulo(a, b, c));
}
quiz · aula 05
Teste seus conhecimentos em Java
0/3 respondidas
QUESTÃO 01
O que viola o princípio Tell, Don't Ask?
QUESTÃO 02
Quando usar método static?
QUESTÃO 03
Qual problema ocorre com Scanner ao usar nextInt() seguido de nextLine()?
0/3