Menu
Coddy logo textTech

Default e Static em Interfaces

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 37 de 87.

Originalmente, as interfaces só podiam conter métodos abstratos sem implementação. A partir do Java 8, as interfaces passaram a poder incluir métodos padrão e métodos estáticos, tornando-as mais flexíveis.

Um método padrão fornece uma implementação diretamente na interface usando a palavra-chave default. As classes que implementam a interface herdam esse comportamento automaticamente, mas podem substituí-lo se necessário:

public interface Drawable {
    void draw();
    
    default void display() {
        System.out.println("Displaying on screen...");
        draw();
    }
}

Qualquer classe que implemente Drawable obtém o método display() gratuitamente. Isso é particularmente útil para adicionar novos métodos a interfaces existentes sem quebrar classes que já os implementam.

Métodos estáticos em interfaces funcionam como métodos estáticos em classes. Eles pertencem à própria interface e são chamados usando o nome da interface:

public interface MathOperations {
    static int add(int a, int b) {
        return a + b;
    }
}

// Uso
int result = MathOperations.add(5, 3);

Métodos estáticos de interface não podem ser sobrescritos e não são herdados pelas classes que os implementam. Eles são úteis para métodos utilitários relacionados à finalidade da interface.

Se uma classe implementa duas interfaces com a mesma assinatura de método padrão, a classe deve substituir esse método para resolver o conflito.

challenge icon

Desafio

Fácil

Vamos criar um sistema de mensagens que demonstra tanto métodos padrão quanto métodos estáticos em interfaces. Você criará uma interface com funcionalidade integrada que as classes que a implementarem poderão usar diretamente ou personalizar conforme necessário.

Você organizará seu código em quatro arquivos:

  • Messenger.java: Defina uma interface que represente qualquer serviço de mensagens. Ela deve declarar um método abstrato sendMessage(String message) que retorna void. Adicione um método padrão chamado sendWithTimestamp(String message) que imprima: [TIMESTAMP] seguido da chamada de sendMessage(message). Inclua também um método estático chamado formatMessage(String message) que retorne a mensagem convertida para letras maiúsculas.
  • EmailMessenger.java: Crie uma classe que implemente Messenger. Ela terá um campo recipient (String). Inclua um construtor para inicializar o destinatário. Implemente sendMessage() para imprimir: Email to [recipient]: [message]. Essa classe usa o método padrão sendWithTimestamp() como está.
  • SMSMessenger.java: Crie outra classe que implemente Messenger. Ela terá um campo phoneNumber (String). Inclua um construtor para inicializar o número de telefone. Implemente sendMessage() para imprimir: SMS to [phoneNumber]: [message]. Substitua o método padrão sendWithTimestamp() para imprimir: [URGENT] seguido da chamada de sendMessage(message), em vez de usar o comportamento padrão de registro de data e hora.
  • Main.java: Reúna tudo para demonstrar os métodos padrão e estático de interfaces. Você receberá três entradas: um destinatário de e-mail, um número de telefone e uma mensagem. Primeiro, use o método estático Messenger.formatMessage() para formatar a mensagem e armazená-la. Em seguida, crie um EmailMessenger e um SMSMessenger. Para cada mensageiro, chame sendWithTimestamp() com a mensagem formatada: observe como o EmailMessenger usa a implementação padrão, enquanto o SMSMessenger usa sua versão substituída.

Você receberá três entradas: o destinatário do e-mail (String), o número de telefone (String) e a mensagem (String).

Sua saída deve mostrar quatro linhas ao todo: duas para cada mensageiro: uma linha de prefixo ([TIMESTAMP] ou [URGENT]) seguida pela linha da mensagem. O EmailMessenger mostrará o prefixo de registro de data e hora padrão, enquanto o SMSMessenger mostrará seu prefixo urgente personalizado. Ambos usarão a mensagem formatada estaticamente (em letras maiúsculas)!

Experimente você mesmo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Ler entradas
        String emailRecipient = scanner.nextLine();
        String phoneNumber = scanner.nextLine();
        String message = scanner.nextLine();
        
        // TODO: Use Messenger.formatMessage() para formatar a mensagem e armazená-la
        
        // TODO: Crie um EmailMessenger com o destinatário do e-mail
        
        // TODO: Crie um SMSMessenger com o número de telefone
        
        // TODO: Chame sendWithTimestamp() no EmailMessenger com a mensagem formatada
        
        // TODO: Chame sendWithTimestamp() no SMSMessenger com a mensagem formatada
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Java online