Categories: Java 8

Delegating pattern using lambda

Delegating pattern

In software engineering, the delegation pattern is an object-oriented design pattern that allows object composition to achieve the same code reuse as an inheritance. In delegation, an object handles a request by delegating to a second object. A delegate is a helper object, but with the original context.

To demonstrate the necessity of delegation of execution, let’s look at an example.

package delegation

public class LazyTest {

	private static int calculate(int x) {
		System.out.println("Called ....");
		return x * 2;
	}


	public static void main(String[] args) {

		int x = 5;
		int temp = calculate(4);
		if (x > 5 && temp >= 4) {
			System.out.println("Path 1");
		} else {
			System.out.println("Path 2");
		}
	}
}

If we run the code, we can observe that the method “calculate” is only called once, and its output is never used.

If we consider other languages like Scala, the execution can be deferred as needed by using the lazy keyword, for example, lazy int temp = calculate(4).

Unfortunately, Java doesn’t support the lazy keyword. We can achieve this by using Lambda.

Lambda can be used to delegate method calls when execution is required.

Let us Design it

package delegation


import java.util.function.Supplier;


public class Lazy<T> {
	
	private T instance;
	private Supplier<T> supplier;


	public Lazy(Supplier<T> supplier) {
		this.supplier = supplier;
	}


	public T get() {
		if (instance == null) {
			instance = supplier.get();
			supplier = null;
		}
		return instance;
	}
}

;

Now let us test the same

package delegation


public class LazyTest {


	private static int calculte(int x) {
		System.out.println("Called ....");
		return x * 2;
	}


	public static void main(String[] args) {
		int x = 5;
		final Lazy<Integer> temp = new Lazy<Integer>(()-> calculte(4));
		if (x > 5 && temp.get() >= 4) {
			System.out.println("Path 1");
		} else {
			System.out.println("Path 2");
		}
	}
}

;

Test 1 – If you run the code right now, you’ll notice that the method calculate is not being called.

Test 2 – Change the value of x to 15 and then run the code. The function calculate is now only run once because the temp is assessed within it, which is fine.

Previous
Next
Pankaj Singh

Specialties: java technologies : Spring, Microservices ,Hibernate, JPA, Apache Spark, Spring Batch, React Js, Maven and Kafka.

Share
Published by
Pankaj Singh

Recent Posts

Strategy Design Patterns using Lambda

Strategy Design Patterns We can easily create a strategy design pattern using lambda. To implement…

2 years ago

Decorator Pattern using Lambda

Decorator Pattern A decorator pattern allows a user to add new functionality to an existing…

2 years ago

Spring Vs Django- Know The Difference Between The Two

Technology has emerged a lot in the last decade, and now we have artificial intelligence;…

2 years ago

TOP 20 MongoDB INTERVIEW QUESTIONS 2022

Managing a database is becoming increasingly complex now due to the vast amount of data…

2 years ago

Scheduler @Scheduled Annotation Spring Boot

Overview In this article, we will explore Spring Scheduler how we could use it by…

3 years ago

Configure Multiple Databases Spring JPA Spring Boot

Overview In this article, we will explore a simple Spring Boot application to implement a…

3 years ago