DEV Community

Cover image for Interfaces in Java for Loose Coupling
Lahiru Kariyakaranage
Lahiru Kariyakaranage

Posted on

Interfaces in Java for Loose Coupling

Why Interfaces, Interfaces are used in Java to achieve loose coupling. which is a design principle whose aim is to reduce the dependencies that exist between many parts of the system.

how interfaces enable loose coupling:

  1. Abstraction: An interface provides a way to define any kind of behavior without defining how it will be implemented. This enables components to communicate with interface without having to know the details of the implementation.
  2. Flexibility: With interfaces, one implementation is replaced by another without any change in the dependent code. This makes a system easier for maintenance.
  3. Modularity: Because interfaces can provide for different components developed and tested independently, they foster modularity. Each component can be developed to conform to the interface, making sure that it can integrate with other components seamlessly.
  4. Dependency Injection: In Spring and similar frameworks, this is used in association with Dependency Injection, which injects the dependencies at runtime. Components are thereby more decoupled, and flexibility of a system is higher when change is required.
  5. Testing: Interfaces let you create unit tests that allow one to mock or stub out the dependencies easily. You can then test each element independently.

Example of Loose Coupling Using Interfaces

public class CreditCardPaymentService implements PaymentService {
    @Override
    public void processPayment(double amount) {
        // Process payment using credit card
    }
}
public class PayPalPaymentService implements PaymentService {
    @Override
public void processPayment(double amount) {
        // payment processing via PayPal
    }
}
public class OrderService {
    private final PaymentService paymentService;
public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
public void placeOrder(double amount) {
        paymentService.processPayment(amount);
    }
}
// Usage
PaymentService paymentService = new CreditCardPaymentService();
OrderService orderService = new OrderService(paymentService);
orderService.placeOrder(100.0);
Enter fullscreen mode Exit fullscreen mode

as shown by the example, OrderService depends on the interface PaymentService, not on its implementation. This allows you to switch between multiple different ways of implementing payments without having to change the OrderService code.

Top comments (0)