Мой вопрос соответствует документации oracle https://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html
Если поля экземпляра содержат ссылки на изменяемые объекты, не допускайте изменения этих объектов:
- Не предоставляйте методы, которые изменяют изменяемые объекты.
- Не делитесь ссылками на изменяемые объекты. Никогда не храните ссылки на внешние изменяемые объекты, переданные в конструктор; при необходимости создайте копии и сохраните ссылки на копии. Точно так же создайте копии ваших внутренних изменяемых объектов, когда это необходимо, чтобы избежать возврата оригиналов в ваши методы.
Для исправления этого мы вернули клонированный объект в методе получения, сделав это, мы не смогли изменить состояние и ссылка , но если мы хотим использовать эту ссылку, мы не можем
Ниже приведен код, который может помочь любой, пожалуйста, помогите мне понять, вернем ли мы клонированную ссылку на адрес, тогда в любой раз мы не можем получить исходную ссылку ??
public final class User {
private final String firstName;
private final String lastName;
private final Address address;
public User(String firstName, String lastName, Address address) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.address = address;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public Address getAddress() {
return address.clone();
}
}
public class Address implements Cloneable{
String firstLine;
String secondLine;
String city;
public Address(String firstLine, String secondLine, String city) {
super();
this.firstLine = firstLine;
this.secondLine = secondLine;
this.city = city;
}
public String getFirstLine() {
return firstLine;
}
public void setFirstLine(String firstLine) {
this.firstLine = firstLine;
}
public String getSecondLine() {
return secondLine;
}
public void setSecondLine(String secondLine) {
this.secondLine = secondLine;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address [firstLine=" + firstLine + ", secondLine=" + secondLine
+ ", city=" + city + "]";
}
}