Рубрики
Без рубрики

Конструктор копирования на Java

Конструктор копирования в Java, конструктор копирования Java, Пример конструктора копирования Java для неизменяемых и изменяемых объектов, Конструктор копирования против клонирования в java, пример конструктора копирования java для глубокого копирования и мелкого копирования

Автор оригинала: Pankaj Kumar.

Конструктор копирования в классе java – это особый тип конструктора, который принимает тот же класс в качестве аргумента. Конструктор копирования используется для предоставления копии указанного объекта.

Конструктор копирования на Java

Конструктор копирования-это простая альтернатива механизму клонирования java.

Конструктор копирования полезен, когда мы хотим скопировать объект, который трудно создать. При написании конструктора копирования очень важно выполнить глубокое копирование, чтобы оба объекта были отделены. Однако в некоторых случаях, когда вы не возражаете против изменения данных объекта, вы также можете пойти на неглубокое копирование.

Давайте посмотрим, как правильно написать конструктор копирования на java и выполнить глубокое копирование объекта.

package com.journaldev.copyconstructor;

import java.util.ArrayList;
import java.util.List;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
@ToString
public class State {

	private List cities;
	private String name;
	private String country;
		
	public State(State st) {
		this.name = st.name; //string is immutable, so we can do direct assignment
		this.country = st.country;

		List ct = new ArrayList<>();
		for (String c : st.cities) {
			ct.add(c);
		}
		this.cities = ct;
	}
}

Обратите внимание, что я использую project lombok, чтобы мне не приходилось писать шаблонный код.

Вот простой тестовый класс, в котором мы используем конструктор копирования.

package com.journaldev.copyconstructor;

import java.util.ArrayList;
import java.util.List;

public class StateTest {

	public static void main(String[] args) {
		State state = getState();
		State stateCopy = new State(state);
		System.out.println("State = "+state);
		System.out.println("StateCopy = "+stateCopy);

		stateCopy.getCities().add("Cupertino");
		stateCopy.setCountry("United States of America");
		
		System.out.println("State = "+state);
		System.out.println("StateCopy = "+stateCopy);

	}

	private static State getState() {
		//in real life, it will do some DB call or expensive API
		//class to fetch the data
		State state = new State();
		state.setName("California");
		state.setCountry("USA");
		List cities = new ArrayList<>();
		cities.add("San Jose"); cities.add("San Francisco");
		state.setCities(cities);
		return state;
	}

	
}

Обратите внимание, что я изменяю некоторые свойства в одном из объектов, если наша реализация глубокого копирования выполнена правильно, то это не должно повлиять на другой объект. Давайте запустим вышеприведенную программу и проверим результат.

State = State(cities=[San Jose, San Francisco], name=California, country=USA)
StateCopy = State(cities=[San Jose, San Francisco], name=California, country=USA)

State = State(cities=[San Jose, San Francisco], name=California, country=USA)
StateCopy = State(cities=[San Jose, San Francisco, Cupertino], name=California, country=United States of America)

Из выходных данных ясно, что наша реализация конструктора копирования верна, изменение одного объекта не повлияло на другой объект, и наша реализация глубокого копирования верна.