Aplicando SOLID Princípios em Java: Exemplos e Melhores Práticas

Single Responsibility Principle(SRP)

Este princípio afirma que cada classe deve ter uma única responsabilidade. Ele enfatiza que uma classe deve executar uma função específica e não ter muitos motivos para mudar.

Exemplo: gerenciamento de informações do usuário e envio de notificações por e-mail.

class UserManager {  
  void createUser(UserData userData) {  
    // Logic for creating a user  
  }  
}  
  
class EmailService {  
  void sendEmail(EmailData emailData) {  
    // Logic for sending an email  
  }  
}  

Open/Closed Principle(OCP)

Esse princípio incentiva a extensão da funcionalidade adicionando um novo código em vez de modificar o código existente.

Exemplo: Lidar com diferentes métodos de pagamento em um aplicativo de comércio eletrônico.

abstract class PaymentProcessor {  
  abstract void processPayment();  
}  
  
class CreditCardPaymentProcessor extends PaymentProcessor {  
  void processPayment() {  
    // Logic for processing credit card payment  
  }  
}  
  
class PayPalPaymentProcessor extends PaymentProcessor {  
  void processPayment() {  
    // Logic for processing PayPal payment  
  }  
}  

Liskov Substitution Principle(LSP)

Este princípio afirma que objetos de uma classe derivada devem ser substituíveis por objetos da classe base sem afetar a correção do programa.

Exemplo: Gerenciamento de formas geométricas.

abstract class Shape {  
  abstract double area();  
}  
  
class Rectangle extends Shape {  
  double area() {  
    // Logic for calculating area of rectangle  
  }  
}  
  
class Square extends Shape {  
  double area() {  
    // Logic for calculating area of square  
  }  
}  

Princípio de Segregação de Interface(ISP)

Esse princípio aconselha dividir as interfaces em interfaces menores para evitar forçar as classes a implementar métodos de que não precisam.

Exemplo: Interfaces para atualização e exibição de dados.

interface UpdateableFeature {  
  void updateFeature();  
}  
  
interface DisplayableFeature {  
  void displayFeature();  
}  

Dependency Inversion Principle(DIP)

Esse princípio sugere o uso de injeção de dependência para gerenciar dependências.

Exemplo: Usando injeção de dependência para gerenciar dependências.

class OrderProcessor {  
  private final DBConnection dbConnection;  
  private final EmailService emailService;  
  
  OrderProcessor(DBConnection dbConnection, EmailService emailService) {  
    this.dbConnection = dbConnection;  
    this.emailService = emailService;  
  }  
}  

Lembre-se de que a aplicação SOLID dos princípios Java deve ser feita de forma flexível com base no objetivo específico do seu projeto e na sua compreensão de SOLID e Java.