Автор оригинала: Pankaj Kumar.
В моем последнем посте я объяснил о шаблоне Builder в Java . Некоторое время назад я написал статью о как создать неизменяемый класс в java . В этом посте мы узнаем, как легко создать неизменяемый класс java с помощью шаблона конструктора. Использование шаблона построителя для создания неизменяемого класса является хорошим подходом, когда количество аргументов в конструкторе больше, что может привести к путанице в их упорядочении.
Важные моменты неизменяемого класса Java
- Неизменяемый класс должен иметь только методы получения.
- Неизменяемый класс будет иметь частный конструктор с объектом Builder в качестве параметра, который будет использоваться для создания неизменяемого класса.
- Если неизменяемые атрибуты класса не являются неизменяемыми, например HashMap, мы должны выполнить глубокое копирование или клонирование, чтобы избежать изменения его атрибутов.
- Использование шаблона компоновщика легко, когда количество необязательных атрибутов больше в неизменяемом классе.
Шаблон неизменяемого построителя классов Java
Вот реализация неизменяемого класса в java с использованием шаблона Builder.
package com.journaldev.design.builder;
import java.util.HashMap;
public class ImmutableClass {
//required fields
private int id;
private String name;
//optional fields
private HashMap properties;
private String company;
public int getId() {
return id;
}
public String getName() {
return name;
}
public HashMap getProperties() {
//return cloned object to avoid changing it by the client application
return (HashMap) properties.clone();
}
public String getCompany() {
return company;
}
private ImmutableClass(ImmutableClassBuilder builder) {
this.id = builder.id;
this.name = builder.name;
this.properties = builder.properties;
this.company = builder.company;
}
//Builder class
public static class ImmutableClassBuilder{
//required fields
private int id;
private String name;
//optional fields
private HashMap properties;
private String company;
public ImmutableClassBuilder(int i, String nm){
this.id=i;
this.name=nm;
}
public ImmutableClassBuilder setProperties(HashMap hm){
this.properties = (HashMap) hm.clone();
return this;
}
public ImmutableClassBuilder setCompany(String comp){
this.company = comp;
return this;
}
public ImmutableClass build(){
return new ImmutableClass(this);
}
}
}
Вот тестовая программа, чтобы проверить, является ли создаваемый нами объект неизменяемым или нет.
package com.journaldev.design.test;
import java.util.HashMap;
import com.journaldev.design.builder.ImmutableClass;
public class ImmutableBuilderTest {
public static void main(String[] args) {
// Getting immutable class only with required parameters
ImmutableClass immutableClass = new ImmutableClass.ImmutableClassBuilder(1, "Pankaj").build();
HashMap hm = new HashMap();
hm.put("Name", "Pankaj");
hm.put("City", "San Jose");
// Getting immutable class with optional parameters
ImmutableClass immutableClass1 = new ImmutableClass.ImmutableClassBuilder(1, "Pankaj")
.setCompany("Apple").setProperties(hm).build();
//Testing immutability
HashMap hm1 = immutableClass1.getProperties();
//lets modify the Object passed as argument or get from the Object
hm1.put("test", "test");
hm.put("test", "test");
//check that immutable class properties are not changed
System.out.println(immutableClass1.getProperties());
}
}
Это все для создания неизменяемого класса в java с использованием шаблона конструктора.
Ссылка: Документация Oracle