-2.7 C
New York
Monday, January 15, 2024

Easy methods to write reusable Java code

Writing reusable code is an important talent for each software program developer, and each engineer should know methods to maximize code reuse. These days, builders usually use the excuse that there is no such thing as a have to trouble with writing high-quality code as a result of microservices are inherently small and environment friendly. Nevertheless, even microservices can develop fairly massive, and the time required to learn and perceive the code will quickly be 10 instances greater than when it was first written.

Fixing bugs or including new options takes significantly extra work when your code shouldn’t be well-written from the beginning. In excessive circumstances, I’ve seen groups throw away the entire software and begin recent with new code. Not solely is time wasted when this occurs, however builders are blamed and will lose their jobs.

This text introduces eight well-tested pointers for writing reusable code in Java.

8 pointers for writing reusable Java code

  1. Outline the principles to your code
  2. Doc your APIs
  3. Observe customary code naming conventions
  4. Write cohesive lessons and strategies
  5. Decouple your lessons
  6. Preserve it SOLID
  7. Use design patterns the place relevant
  8. Do not reinvent the wheel

Outline the principles to your code

Step one to writing reusable code is to outline code requirements along with your crew. In any other case, the code will get messy in a short time. Meaningless discussions about code implementation may also usually occur if there is no such thing as a alignment with the crew. Additionally, you will need to decide a fundamental code design for the issues you need the software program to unravel.

Upon getting the requirements and code design, it is time to outline the rules to your code. Code pointers decide the principles to your code:

  • Code naming
  • Class and methodology line amount
  • Exception dealing with
  • Package deal construction
  • Programming language and model
  • Frameworks, instruments, and libraries
  • Code testing requirements
  • Code layers (controller, service, repository, area, and so on.)

When you agree on the principles to your code, you may maintain the entire crew accountable for reviewing it and making certain the code is well-written and reusable. If there is no such thing as a crew settlement, there is no such thing as a approach the code shall be written to a wholesome and reusable customary.

Doc your APIs

When creating providers and exposing them as an API, you want to doc the API in order that it’s simple for a brand new developer to grasp and use.

APIs are very generally used with the microservices structure. Because of this, different groups that do not know a lot about your mission should have the ability to learn your API documentation and perceive it. If the API shouldn’t be properly documented, code repetition is extra possible. The brand new builders will in all probability create one other API methodology, duplicating the present one.

So, documenting your API is essential. On the identical time, overusing documentation in code would not convey a lot worth. Solely doc the code that’s invaluable in your API. For instance, clarify the enterprise operations within the API, parameters, return objects, and so forth.

Observe customary code naming conventions

Easy and descriptive code names are a lot most well-liked to mysterious acronyms. Once I see an acronym in an unfamiliar codebase, I normally do not know what it means.

So, as an alternative of utilizing the acronym Ctr, write Buyer. It is clear and significant. Ctr could possibly be an acronym for contract, management, buyer—it might imply so many issues!

Additionally, use your programming language naming conventions. For Java, for instance, there may be the JavaBeans naming conference. It is easy, and each Java developer ought to perceive it. This is methods to identify lessons, strategies, variables, and packages in Java:

  • Lessons, PascalCase: CustomerContract
  • Strategies and variables, camelCase: customerContract
  • Packages, all lowercase: service

Write cohesive lessons and strategies

Cohesive code does one factor very properly. Though writing cohesive lessons and strategies is an easy idea, even skilled builders do not comply with it very properly. Because of this, they create ultra-responsible lessons, which means lessons that do too many issues. These are typically also referred to as god lessons.

To make your code cohesive, it’s essential to know methods to break it down so that every class and methodology does one factor properly. Should you create a way referred to as saveCustomer, you need this methodology to have one motion: to save lots of a buyer. It mustn’t additionally replace and delete prospects.

Likewise, if we’ve a category named CustomerService, it ought to solely have options that belong to the shopper. If we’ve a way within the CustomerService class that performs operations with the product area, we should always transfer the tactic to the ProductService class.

Moderately than having a way that does product operations within the CustomerService class, we will use the ProductService within the CustomerService class and invoke no matter methodology we’d like from it.

To know this idea higher, let’s first take a look at an instance of a category that’s not cohesive:

public class CustomerPurchaseService {

    public void saveCustomerPurchase(CustomerPurchase customerPurchase) {
         // Does operations with buyer
         // replace buyer
         // delete buyer

    non-public void registerProduct(Product product) {
         // Performs logic for product within the area of the shopper…


Okay, so what are the problems with this class?

  • The saveCustomerPurchase methodology registers the product in addition to updating and deleting the shopper. This methodology does too many issues.
  • The registerProduct methodology is tough to seek out. Due to that, there’s a good likelihood a developer will duplicate this methodology if one thing like it’s wanted.
  • The registerProduct methodology is within the unsuitable area. CustomerPurchaseService should not be registering merchandise.
  • The saveCustomerPurchase methodology invokes a non-public methodology as an alternative of utilizing an exterior class that performs product operations.

Now that we all know what’s unsuitable with the code, we will rewrite it to make it cohesive. We are going to transfer the registerProduct methodology to its appropriate area, ProductService. That makes the code a lot simpler to look and reuse. Additionally, this methodology will not be caught contained in the CustomerPurchaseService:

public class CustomerPurchaseService {

    non-public ProductService productService;

    public CustomerPurchaseService(ProductService productService) {
      this.productService = productService;

    public void saveCustomerPurchase(CustomerPurchase customerPurchase) {
         // Does operations with buyer


public class ProductService {

   public void registerProduct(Product product) {
         // Performs logic for product within the area of the shopper…

Right here, we have made the saveCustomerPurchase do only one factor: save the shopper buy, nothing else. We additionally delegated the duty to registerProduct to the ProductService class, which makes each lessons extra cohesive. Now, the lessons and their strategies do what we count on.

Decouple your lessons

Extremely coupled code is code that has too many dependencies, making the code tougher to keep up. The extra dependencies (variety of lessons outlined) a category has, the extra extremely coupled it’s.

One of the best ways to strategy code reuse is to make techniques and code as minimally depending on one another as attainable. A sure coupling degree will all the time exist as a result of providers and code should talk. The hot button is to make these providers as impartial as attainable.

This is an instance of a extremely coupled class:

public class CustomerOrderService {

  non-public ProductService productService;
  non-public OrderService orderService;
  non-public CustomerPaymentRepository customerPaymentRepository;
  non-public CustomerDiscountRepository customerDiscountRepository;
  non-public CustomerContractRepository customerContractRepository;
  non-public CustomerOrderRepository customerOrderRepository;
  non-public CustomerGiftCardRepository customerGiftCardRepository;

  // Different strategies…

Discover that the CustomerService is very coupled with many different service lessons. Having so many dependencies means the category requires many strains of code. That makes the code tough to check and onerous to keep up.

A greater strategy is to separate this class into providers with fewer dependencies. Let’s lower the coupling by breaking the CustomerService class into separate providers:

public class CustomerOrderService {

  non-public OrderService orderService;
  non-public CustomerPaymentService customerPaymentService;
  non-public CustomerDiscountService customerDiscountService;

  // Omitted different strategies…

public class CustomerPaymentService {

  non-public ProductService productService;
  non-public CustomerPaymentRepository customerPaymentRepository;
  non-public CustomerContractRepository customerContractRepository;
  // Omitted different strategies…

public class CustomerDiscountService {
  non-public CustomerDiscountRepository customerDiscountRepository;
  non-public CustomerGiftCardRepository customerGiftCardRepository;

  // Omitted different strategies…

After refactoring, CustomerService and different lessons are a lot simpler to unit check, and they’re additionally simpler to keep up. The extra specialised and concise the category is, the better it’s to implement new options. If there are bugs, they’re going to be simpler to repair.

Preserve it SOLID

SOLID is an acronym that represents 5 design ideas in object-oriented programming (OOP). These ideas purpose to make software program techniques extra maintainable, versatile, and simply understood. This is a quick clarification of every precept:

  • Single Duty Precept (SRP): A category ought to have a single duty or goal and encapsulate that duty. This precept promotes excessive cohesion and helps in holding lessons targeted and manageable.
  • Open-Closed Precept (OCP): Software program entities (lessons, modules, strategies, and so on.) must be open for extension however closed for modification. You must design your code to let you add new functionalities or behaviors with out modifying present code, decreasing the influence of modifications and selling code reuse.
  • Liskov Substitution Precept (LSP): Objects of a superclass must be replaceable with objects of its subclasses with out affecting the correctness of this system. In different phrases, any occasion of a base class must be substitutable with any occasion of its derived lessons, making certain that this system’s habits stays constant.
  • Interface Segregation Precept (ISP): Shoppers shouldn’t be compelled to rely on interfaces they don’t use. This precept advises breaking down massive interfaces into smaller and extra particular ones in order that shoppers solely have to rely on the related interfaces. This promotes unfastened coupling and avoids pointless dependencies.
  • Dependency Inversion Precept (DIP): Excessive-level modules mustn’t rely on low-level modules. Each ought to rely on abstractions. This precept encourages utilizing abstractions (interfaces or summary lessons) to decouple high-level modules from low-level implementation particulars. It promotes the concept lessons ought to rely on abstractions fairly than concrete implementations, making the system extra versatile and facilitating simpler testing and upkeep.

By following these SOLID ideas, builders can create extra modular, maintainable, and extensible code. These ideas assist obtain code that’s simpler to grasp, check, and modify, resulting in extra sturdy and adaptable software program techniques.

Use design patterns the place relevant

Design patterns had been created by skilled builders who’ve gone by many coding conditions. When used appropriately, design patterns assist with code reuse.

Understanding design patterns additionally improves your skill to learn and perceive code—even code from the JDK is clearer when you may see the underlying design sample.

Despite the fact that design patterns are highly effective, no design sample is a silver bullet; we nonetheless have to be very cautious about utilizing them. For instance, it is a mistake to make use of a design sample simply because we all know it. Utilizing a design sample within the unsuitable state of affairs makes the code extra complicated and tough to keep up. Nevertheless, making use of a design sample for the correct use case makes the code extra versatile for extension.

This is a fast abstract of design patterns in object-oriented programming:

Creational patterns

  • Singleton: Ensures a category has just one occasion and gives international entry to it.
  • Manufacturing unit methodology: Defines an interface for creating objects, however lets subclasses resolve which class to instantiate.
  • Summary manufacturing facility: Supplies an interface for creating households of associated or dependent objects.
  • Builder: Separates the development of complicated objects from their illustration.
  • Prototype: Creates new objects by cloning present ones.

Structural patterns

  • Adapter: Converts the interface of a category into one other interface that shoppers count on.
  • Decorator: Dynamically provides habits to an object.
  • Proxy: Supplies a surrogate or placeholder for one more object to regulate entry to it.
  • Composite: Treats a bunch of objects as a single object.
  • Bridge: Decouples an abstraction from its implementation.

Supply hyperlink

Related Articles


Please enter your comment!
Please enter your name here

Latest Articles