Clean Code in Java: Principles of Writing Clean Code with Examples

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

Introduction: Why Clean Code is the Key to a Successful Project

Sooner or later, every developer encounters "dirty" code: meaningless variable names, functions hundreds of lines long, repetitive blocks, and magic numbers. Such code is hard to read, difficult to maintain, and nearly impossible to extend without risking breaking the entire application. Robert Martin's book "Clean Code" has become a bible for programmers striving to write quality code. In this article, we will break down the key principles of Clean Code in Java with clear examples that will help you make your code understandable, reliable, and easy to maintain.



1. Naming: Speak the Language of Business

A variable, method, or class name should answer the questions: "What is this?" and "Why is it needed?". Avoid single-letter abbreviations and abstract terms.



Bad Example

int d; // time since order (in days)List<String> lst = new ArrayList<>();void prc() { ... }


Good Example

int daysSinceOrder;List<String> customerNames = new ArrayList<>();void processPayment() { ... }


Additional Recommendations

  • Classes — nouns: Order, CustomerRepository.
  • Methods — verbs or verb pairs: saveOrder(), isValidEmail().
  • Avoid "noise" words: Data, Info, Manager — if they don't carry meaning.


2. Functions: Short, Clear, One Task

A function should do only one thing and do it well. The ideal length is 10–15 lines. If a function doesn't fit on the screen — break it up.



Bad Example: Swiss Army Knife Function

public void processOrder(Order order) {    // 1. Validation    if (order == null || order.getItems().isEmpty()) {        throw new IllegalArgumentException("Invalid order");    }    // 2. Discount calculation    double discount = 0;    if (order.getTotal() > 1000) discount = 0.1;    // 3. Save to DB    database.save(order);    // 4. Send email    emailService.sendConfirmation(order.getCustomerEmail());}


Good Example: Separation of Responsibilities

public void processOrder(Order order) {    validateOrder(order);    applyDiscount(order);    persistOrder(order);    notifyCustomer(order);}

private void validateOrder(Order order) { if (order == null || order.getItems().isEmpty()) { throw new IllegalArgumentException("Invalid order"); }}

private void applyDiscount(Order order) { if (order.getTotal() > 1000) { order.setDiscount(0.1); }}

private void persistOrder(Order order) { database.save(order);}

private void notifyCustomer(Order order) { emailService.sendConfirmation(order.getCustomerEmail());}


3. Avoid Duplication (DRY) and Magic Numbers

Repetitive code is the main enemy of maintainability. If you are copying a block of code, it's time to extract it into a separate method or constant.



Problem: Magic Numbers

if (age > 18) { ... } // What is 18? Minimum age? Discount threshold?


Solution: Named Constants

private static final int MINIMUM_DRIVING_AGE = 18;// ...if (age > MINIMUM_DRIVING_AGE) { ... }


Example of Duplication

// Baddouble totalForFirst = price1 * quantity1 * 0.95;double totalForSecond = price2 * quantity2 * 0.95;

// Gooddouble calculateLineTotal(double price, int quantity) { return price * quantity * 0.95;}double totalForFirst = calculateLineTotal(price1, quantity1);double totalForSecond = calculateLineTotal(price2, quantity2);


Blogs

Book Recommendations