Просто хотел добавить, что в Java конструктор копирования не совсем бесполезен.
В некоторых случаях у вашего класса есть закрытая переменная экземпляра изменяемого не финального типа , например, Date
, и имеет установщик и получатель для переменной. В установщике вы должны сделать копию данной даты, потому что вызывающая сторона может изменить ее позже и, таким образом, манипулировать внутренним состоянием вашего объекта (обычно случайно, но, возможно, преднамеренно). В геттере требуется та же мера предосторожности.
Защитная копия может быть реализована путем вызова clone()
(класс Date
является клонируемым), но злоумышленник может вызвать сеттер с подклассом Date
, который переопределяет метод clone()
с помощью {return this;}
и поэтому вызывающий может все еще иметь возможность манипулировать вашим объектом. Вот где в игру вступает конструктор копирования: вызывая new Date(theDate)
, вы обязательно получите свежий экземпляр Date
с той же отметкой времени, что и указанная дата, без какой-либо связи между двумя экземплярами даты. В геттере вы можете использовать метод clone, потому что вы знаете, что закрытая переменная будет иметь класс Date
, но для согласованности обычно используется и конструктор копирования.
Также обратите внимание, что конструктор копирования отметил бы, что требуется, если класс Date
был конечным (вызов clone()
безопасен) или неизменным (копирование не требуется).