<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Davi Gustavo Gonçalves da Cunha</title>
    <description>The latest articles on DEV Community by Davi Gustavo Gonçalves da Cunha (@daviggc).</description>
    <link>https://dev.to/daviggc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4123433%2Fd8d64255-59cb-4d7e-b97b-2457e71dd83e.png</url>
      <title>DEV Community: Davi Gustavo Gonçalves da Cunha</title>
      <link>https://dev.to/daviggc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/daviggc"/>
    <language>en</language>
    <item>
      <title>Unshackling Java Architecture: How the Builder Pattern Rescued Our Legacy System</title>
      <dc:creator>Davi Gustavo Gonçalves da Cunha</dc:creator>
      <pubDate>Sun, 13 Sep 2026 19:04:05 +0000</pubDate>
      <link>https://dev.to/daviggc/unshackling-java-architecture-how-the-builder-pattern-rescued-our-legacy-system-1ngk</link>
      <guid>https://dev.to/daviggc/unshackling-java-architecture-how-the-builder-pattern-rescued-our-legacy-system-1ngk</guid>
      <description>&lt;h1&gt;
  
  
  Unshackling Java Architecture: How the Builder Pattern Rescued Our Legacy System
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A practical guide to the Builder Design Pattern in Java --- from&lt;br&gt;
legacy constructors to immutable, self-validating domain objects.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. Core Fundamentals --- The Problem &amp;amp; The Theory
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Introduction: What Are Design Patterns?
&lt;/h3&gt;

&lt;p&gt;In enterprise software engineering, architectural bottlenecks and design&lt;br&gt;
flaws tend to recur. As systems scale, challenges such as &lt;strong&gt;tight&lt;br&gt;
coupling, fragile code, and monolithic classes&lt;/strong&gt; inevitably surface.&lt;/p&gt;

&lt;p&gt;To prevent engineers from constantly &lt;em&gt;"reinventing the wheel,"&lt;/em&gt; the&lt;br&gt;
industry relies on &lt;strong&gt;Design Patterns&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Cataloged in 1994 by the &lt;strong&gt;Gang of Four (GoF)&lt;/strong&gt;, Design Patterns are&lt;br&gt;
formal, battle-tested solutions to common object-oriented software&lt;br&gt;
design problems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Takeaway:&lt;/strong&gt; Design Patterns are not libraries, frameworks, or&lt;br&gt;
copy-paste code snippets. Instead, they act as &lt;strong&gt;architectural&lt;br&gt;
blueprints&lt;/strong&gt; that guide how classes and objects should interact to&lt;br&gt;
maintain low coupling, high extensibility, and clean maintainability.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article focuses on the &lt;strong&gt;Builder Pattern&lt;/strong&gt;, a &lt;strong&gt;Creational Design&lt;br&gt;
Pattern&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  What Is a Creational Pattern?
&lt;/h3&gt;

&lt;p&gt;Creational patterns focus on &lt;strong&gt;how objects are created&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They help control object construction and reduce problems caused by&lt;br&gt;
constructors with too many parameters, unclear argument ordering, or&lt;br&gt;
partially initialized objects.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Problem: Telescoping Constructors &amp;amp; Inconsistent State
&lt;/h2&gt;

&lt;p&gt;In legacy Java systems, classes frequently accumulate dozens of fields&lt;br&gt;
over time.&lt;/p&gt;

&lt;p&gt;When instantiating these classes, developers often resort to two naive&lt;br&gt;
approaches --- both creating serious engineering bottlenecks.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. The Telescoping Constructor Problem
&lt;/h3&gt;

&lt;p&gt;The class relies on massive constructors overloaded with parameters.&lt;/p&gt;

&lt;p&gt;Callers end up passing multiple &lt;code&gt;null&lt;/code&gt; references or obscure boolean&lt;br&gt;
flags such as &lt;code&gt;true&lt;/code&gt; and &lt;code&gt;false&lt;/code&gt;, whose meanings are impossible to&lt;br&gt;
decipher without checking the class declaration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Legacy Anti-Pattern:&lt;/span&gt;
&lt;span class="c1"&gt;// What do these parameters actually mean?&lt;/span&gt;
&lt;span class="c1"&gt;//&lt;/span&gt;
&lt;span class="c1"&gt;// Parameter order swapping can cause silent,&lt;/span&gt;
&lt;span class="c1"&gt;// critical bugs in production.&lt;/span&gt;

&lt;span class="nc"&gt;CreditApplication&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CreditApplication&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"12345"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="mf"&gt;50000.00&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="mf"&gt;0.05&lt;/span&gt;
&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The main problem is &lt;strong&gt;not simply the number of parameters&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The real problem is that the constructor exposes implementation details&lt;br&gt;
and makes the caller responsible for remembering the correct parameter&lt;br&gt;
order.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Excessive Setters --- Mutability &amp;amp; Partial State
&lt;/h3&gt;

&lt;p&gt;Another common solution is to instantiate an empty object and populate&lt;br&gt;
its fields step-by-step through setter methods.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;CreditApplication&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CreditApplication&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setCustomerId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"12345"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRequestedAmount&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"50000"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTenureMonths&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setIncludesInsurance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Although this approach appears simpler, it introduces another problem.&lt;/p&gt;

&lt;p&gt;During construction, the object may exist in a &lt;strong&gt;temporarily invalid or&lt;br&gt;
incomplete state&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Furthermore, excessive use of setters prevents fields from being&lt;br&gt;
declared &lt;code&gt;final&lt;/code&gt;, weakening immutability and making the object harder to&lt;br&gt;
reason about in concurrent environments.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Concept: The Assembly Line &amp;amp; Fluent Interface
&lt;/h2&gt;

&lt;p&gt;The Builder Pattern resolves this dilemma by &lt;strong&gt;separating the&lt;br&gt;
construction of a complex object from its representation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think of the Builder as a custom &lt;strong&gt;assembly line&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of forcing every component into a constructor at once,&lt;br&gt;
construction is delegated to an intermediate Builder object.&lt;/p&gt;

&lt;p&gt;The process becomes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Configure&lt;/strong&gt; the object step-by-step.&lt;/li&gt;
&lt;li&gt; Use descriptive, self-documenting methods.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Enforce required fields&lt;/strong&gt; early.&lt;/li&gt;
&lt;li&gt; Configure optional parameters only when necessary.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Execute validation&lt;/strong&gt; through &lt;code&gt;.build()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; Return a fully initialized object.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach enables a &lt;strong&gt;Fluent Interface&lt;/strong&gt;, where builder methods&lt;br&gt;
return &lt;code&gt;this&lt;/code&gt;, allowing clean method chaining.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;CreditApplication&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CreditApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"CUST-9981"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"150000.00"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withTenureMonths&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withInsurance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withGuarantor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"TAX-ID-5541"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The resulting code is significantly easier to understand than a&lt;br&gt;
constructor containing several positional parameters.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Development --- Case Study, Architecture &amp;amp; Code
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Real-World Scenario: The Credit Analysis Engine
&lt;/h3&gt;

&lt;p&gt;In financial-sector architectures such as &lt;strong&gt;Fintech applications&lt;/strong&gt;, the&lt;br&gt;
business domain is highly complex.&lt;/p&gt;

&lt;p&gt;Imagine a microservice responsible for processing loan applications.&lt;/p&gt;

&lt;p&gt;Each credit proposal requires mandatory information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Customer ID&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Requested amount&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It may also contain optional information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Tenure in months&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Life insurance inclusion&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Guarantor tax ID&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the legacy system, instantiating the &lt;code&gt;CreditApplication&lt;/code&gt; class&lt;br&gt;
required the use of a &lt;strong&gt;Telescoping Constructor&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Developers were forced to pass &lt;code&gt;null&lt;/code&gt; for unused fields.&lt;/p&gt;

&lt;p&gt;This created a serious risk: objects could reach the &lt;strong&gt;Risk Analysis&lt;br&gt;
Engine&lt;/strong&gt; in an inconsistent state, resulting in silent failures or&lt;br&gt;
unexpected business behavior.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Visual Representation --- System Diagrams
&lt;/h2&gt;

&lt;p&gt;To document the solution, we mapped the pattern at &lt;strong&gt;two architectural&lt;br&gt;
levels&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  UML Class Diagram --- The Pattern's Structure
&lt;/h3&gt;

&lt;p&gt;The UML diagram illustrates how the &lt;code&gt;CreditApplication&lt;/code&gt; domain class&lt;br&gt;
encapsulates its &lt;strong&gt;private constructor&lt;/strong&gt;, forcing instantiation&lt;br&gt;
exclusively through the static inner &lt;code&gt;Builder&lt;/code&gt; class.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;classDiagram
    class CreditApplication {
        -String customerId
        -BigDecimal requestedAmount
        -int tenureMonths
        -boolean includesInsurance
        -String guarantorTaxId
        -CreditApplication(Builder builder)
        +getCustomerId() String
        +getRequestedAmount() BigDecimal
        +getTenureMonths() int
        +isIncludesInsurance() boolean
        +getGuarantorTaxId() String
    }

    class Builder {
        -String customerId
        -BigDecimal requestedAmount
        -int tenureMonths
        -boolean includesInsurance
        -String guarantorTaxId
        +Builder(String customerId, BigDecimal requestedAmount)
        +withTenureMonths(int tenure) Builder
        +withInsurance(boolean includesInsurance) Builder
        +withGuarantor(String taxId) Builder
        +build() CreditApplication
    }

    Builder ..&amp;gt; CreditApplication : &amp;lt;&amp;lt;instantiates&amp;gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  High-Level Software Architecture Diagram
&lt;/h3&gt;

&lt;p&gt;The second diagram shows exactly where the Builder operates within the&lt;br&gt;
application architecture.&lt;/p&gt;

&lt;p&gt;The Builder is triggered by the &lt;strong&gt;Service Layer&lt;/strong&gt; after the REST&lt;br&gt;
Controller receives the API payload.&lt;/p&gt;

&lt;p&gt;This ensures that only &lt;strong&gt;validated domain objects&lt;/strong&gt; reach the Risk&lt;br&gt;
Analysis Engine.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    A[Client API] --&amp;gt;|1. POST /credit| B[REST Controller]
    B --&amp;gt;|2. DTO| C[Service Layer]

    subgraph Domain [Immutable Domain Layer]
        C --&amp;gt;|3. Configures| D[CreditApplication.Builder]
        D --&amp;gt;|4. Validates &amp;amp; builds| E([CreditApplication Object])
    end

    E --&amp;gt;|5A. Evaluates| F[Risk Analysis Engine]
    E --&amp;gt;|5B. Persists| G[(PostgreSQL Database)]&lt;/code&gt;&lt;/pre&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Architecture view:&lt;/strong&gt; The Builder belongs inside the &lt;strong&gt;Domain&lt;br&gt;
Layer&lt;/strong&gt;, between application-level input and the creation of the&lt;br&gt;
immutable domain object.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Java Implementation --- Clean and Functional Code
&lt;/h2&gt;

&lt;p&gt;Below is the implementation of the pattern.&lt;/p&gt;

&lt;p&gt;Notice how business rules and integrity validations are handled &lt;strong&gt;before&lt;br&gt;
the domain object is created&lt;/strong&gt;, protecting the domain from invalid&lt;br&gt;
state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.fintech.credit&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.math.BigDecimal&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Immutable Domain Entity using the Builder Pattern.
 */&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreditApplication&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;customerId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;requestedAmount&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;tenureMonths&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;includesInsurance&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;guarantorTaxId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;CreditApplication&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Builder&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;customerId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;customerId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestedAmount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestedAmount&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tenureMonths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tenureMonths&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;includesInsurance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;includesInsurance&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;guarantorTaxId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;guarantorTaxId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getCustomerId&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;customerId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;getRequestedAmount&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;requestedAmount&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getTenureMonths&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tenureMonths&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isIncludesInsurance&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;includesInsurance&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getGuarantorTaxId&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;guarantorTaxId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Builder&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;customerId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;requestedAmount&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;tenureMonths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;includesInsurance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;guarantorTaxId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Builder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;customerId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;requestedAmount&lt;/span&gt;
        &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customerId&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;customerId&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                    &lt;span class="s"&gt;"Customer ID is required."&lt;/span&gt;
                &lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;requestedAmount&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
                &lt;span class="n"&gt;requestedAmount&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compareTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ZERO&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
            &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                    &lt;span class="s"&gt;"Requested amount must be greater than zero."&lt;/span&gt;
                &lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;customerId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;customerId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestedAmount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requestedAmount&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Builder&lt;/span&gt; &lt;span class="nf"&gt;withTenureMonths&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;tenureMonths&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tenureMonths&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                    &lt;span class="s"&gt;"Tenure must be greater than zero."&lt;/span&gt;
                &lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tenureMonths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tenureMonths&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Builder&lt;/span&gt; &lt;span class="nf"&gt;withInsurance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;includesInsurance&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;includesInsurance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;includesInsurance&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Builder&lt;/span&gt; &lt;span class="nf"&gt;withGuarantor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;guarantorTaxId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;guarantorTaxId&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;guarantorTaxId&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                    &lt;span class="s"&gt;"Guarantor tax ID cannot be blank."&lt;/span&gt;
                &lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;guarantorTaxId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;guarantorTaxId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CreditApplication&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;requestedAmount&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compareTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"100000"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
                &lt;span class="n"&gt;guarantorTaxId&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
            &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalStateException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                    &lt;span class="s"&gt;"Loans over $100k require a registered guarantor."&lt;/span&gt;
                &lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CreditApplication&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Application in the Service Layer
&lt;/h2&gt;

&lt;p&gt;The Builder can then be used by the Service Layer through a &lt;strong&gt;fluent and&lt;br&gt;
self-documenting API&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;CreditApplication&lt;/span&gt; &lt;span class="n"&gt;secureApp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CreditApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"CUST-9981"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"150000.00"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withTenureMonths&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withInsurance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withGuarantor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"TAX-ID-5541"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What does this code communicate?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Customer:&lt;/strong&gt; &lt;code&gt;CUST-9981&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Requested amount:&lt;/strong&gt; &lt;code&gt;$150,000.00&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Tenure:&lt;/strong&gt; 36 months&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Insurance:&lt;/strong&gt; enabled&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Guarantor:&lt;/strong&gt; registered&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Object:&lt;/strong&gt; validated and immutable after construction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important point is that the code communicates &lt;strong&gt;intent&lt;/strong&gt;, not just&lt;br&gt;
values.&lt;/p&gt;


&lt;h2&gt;
  
  
  6. Pros and Cons --- Trade-Off Analysis
&lt;/h2&gt;

&lt;p&gt;In software engineering, every architectural decision has a cost.&lt;/p&gt;

&lt;p&gt;Adopting the Builder Pattern brought the following impacts to our&lt;br&gt;
architecture.&lt;/p&gt;
&lt;h3&gt;
  
  
  Pros --- Advantages
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1. Guaranteed Immutability
&lt;/h4&gt;

&lt;p&gt;Using &lt;code&gt;final&lt;/code&gt; variables and removing setters makes the object&lt;br&gt;
&lt;strong&gt;immutable after construction&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once constructed, the state of the &lt;code&gt;CreditApplication&lt;/code&gt; cannot be&lt;br&gt;
changed.&lt;/p&gt;

&lt;p&gt;This makes the object easier to reason about and safer to use in&lt;br&gt;
concurrent environments.&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Centralized Validation
&lt;/h4&gt;

&lt;p&gt;No &lt;code&gt;CreditApplication&lt;/code&gt; instance is created before the required&lt;br&gt;
validation rules are satisfied.&lt;/p&gt;

&lt;p&gt;The guarantor rule, for example, is enforced inside &lt;code&gt;.build()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;requestedAmount&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compareTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"100000"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="n"&gt;guarantorTaxId&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalStateException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"Loans over $100k require a registered guarantor."&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This protects the domain from invalid states.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Readability --- Fluent API
&lt;/h4&gt;

&lt;p&gt;Method chaining makes the code's intent explicit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without Builder:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CreditApplication&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"CUST-9981"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"150000.00"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
    &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"TAX-ID-5541"&lt;/span&gt;
&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;With Builder:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CreditApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"CUST-9981"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"150000.00"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withTenureMonths&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withInsurance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withGuarantor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"TAX-ID-5541"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second version communicates the meaning of each value &lt;strong&gt;without&lt;br&gt;
requiring the developer to inspect the constructor declaration&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Cons --- Trade-Offs &amp;amp; Costs
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1. Boilerplate Code
&lt;/h4&gt;

&lt;p&gt;There is obvious code duplication.&lt;/p&gt;

&lt;p&gt;Entity attributes must generally be represented in both the domain&lt;br&gt;
object and the Builder.&lt;/p&gt;

&lt;p&gt;This increases the amount of code that must be maintained.&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Maintenance Cost
&lt;/h4&gt;

&lt;p&gt;When adding a new field, developers may need to update multiple&lt;br&gt;
locations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The domain entity&lt;/li&gt;
&lt;li&gt;  The Builder&lt;/li&gt;
&lt;li&gt;  The private constructor&lt;/li&gt;
&lt;li&gt;  Potential validation rules&lt;/li&gt;
&lt;li&gt;  Service-layer construction code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Therefore, the Builder Pattern is &lt;strong&gt;not completely free from maintenance&lt;br&gt;
overhead&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  3. Initial Overhead
&lt;/h4&gt;

&lt;p&gt;For simple domain classes containing only two or three fields,&lt;br&gt;
introducing a Builder may constitute &lt;strong&gt;over-engineering&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Address&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Street A"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"123"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;may be perfectly reasonable.&lt;/p&gt;

&lt;p&gt;The Builder Pattern becomes more useful as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The number of optional parameters increases.&lt;/li&gt;
&lt;li&gt;  Validation rules become more complex.&lt;/li&gt;
&lt;li&gt;  Object construction becomes harder to understand.&lt;/li&gt;
&lt;li&gt;  Immutability becomes important.&lt;/li&gt;
&lt;li&gt;  Multiple construction variations exist.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Conclusion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;Refactoring the &lt;code&gt;CreditApplication&lt;/code&gt; class using the Builder Pattern&lt;br&gt;
directly solved the &lt;strong&gt;readability and fragility issues&lt;/strong&gt; of the&lt;br&gt;
microservice.&lt;/p&gt;

&lt;p&gt;The approach provides several architectural benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Eliminates&lt;/strong&gt; telescoping constructors.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Reduces&lt;/strong&gt; the use of meaningless &lt;code&gt;null&lt;/code&gt; parameters.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Prevents&lt;/strong&gt; incomplete objects from being created.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Encourages&lt;/strong&gt; immutable domain objects.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Centralizes&lt;/strong&gt; construction-time validation.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Makes&lt;/strong&gt; object creation self-documenting.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Improves&lt;/strong&gt; maintainability of complex domain models.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is not simply cleaner syntax.&lt;/p&gt;

&lt;p&gt;It is a &lt;strong&gt;domain model with stronger guarantees about its own state&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Personal View
&lt;/h3&gt;

&lt;p&gt;Implementing the Builder Pattern in a real-world scenario showed me how&lt;br&gt;
small design flaws --- such as accepting constructors full of &lt;code&gt;null&lt;/code&gt;&lt;br&gt;
values or abusing setter methods --- can accumulate significant&lt;br&gt;
technical debt over time.&lt;/p&gt;

&lt;p&gt;As a Software Engineering student focusing on modern software&lt;br&gt;
ecosystems, I realize that an engineer's true differentiator is not&lt;br&gt;
simply making the code run.&lt;/p&gt;

&lt;p&gt;It is designing software that is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Predictable&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Secure&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Maintainable&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Extensible&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Self-documenting&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Builder Pattern is a relatively small design decision, but when&lt;br&gt;
applied to the right problem, it can significantly improve the quality&lt;br&gt;
of a domain model.&lt;/p&gt;
&lt;h3&gt;
  
  
  Final Takeaway
&lt;/h3&gt;

&lt;p&gt;The Builder Pattern is &lt;strong&gt;not a universal solution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It should not be introduced merely because a class has several fields.&lt;/p&gt;

&lt;p&gt;Its value becomes clear when object construction itself becomes a source&lt;br&gt;
of &lt;strong&gt;complexity, ambiguity, or invalid state&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In those situations, the Builder acts as a controlled assembly line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Required Data
      ↓
   Builder
      ↓
Optional Configuration
      ↓
  Validation
      ↓
   .build()
      ↓
Immutable Domain Object
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Principle:&lt;/strong&gt;\&lt;br&gt;
&lt;strong&gt;Make invalid objects difficult --- or impossible --- to create.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That principle is often more valuable than the pattern itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Discussion
&lt;/h2&gt;

&lt;p&gt;Have you ever had to deal with &lt;strong&gt;massive constructors full of &lt;code&gt;null&lt;/code&gt;&lt;br&gt;
values and indecipherable boolean parameters&lt;/strong&gt; in a legacy project?&lt;/p&gt;

&lt;p&gt;How does your team handle the construction of complex domain objects?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Share your experience&lt;/strong&gt; or tag a colleague who needs to refactor that&lt;br&gt;
legacy constructor today!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linkedln:&lt;/strong&gt; &lt;a href="http://www.linkedin.com/in/davi-gustavo-gon%C3%A7alves-da-cunha-ba2689282" rel="noopener noreferrer"&gt;www.linkedin.com/in/davi-gustavo-gonçalves-da-cunha-ba2689282&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/DaviGGC" rel="noopener noreferrer"&gt;https://github.com/DaviGGC&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>poo</category>
      <category>architecture</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
