Неизменяемый класс содержит изменяемую ссылку - PullRequest
0 голосов
/ 24 февраля 2020

Мой вопрос соответствует документации oracle https://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html

Если поля экземпляра содержат ссылки на изменяемые объекты, не допускайте изменения этих объектов:

  1. Не предоставляйте методы, которые изменяют изменяемые объекты.
  2. Не делитесь ссылками на изменяемые объекты. Никогда не храните ссылки на внешние изменяемые объекты, переданные в конструктор; при необходимости создайте копии и сохраните ссылки на копии. Точно так же создайте копии ваших внутренних изменяемых объектов, когда это необходимо, чтобы избежать возврата оригиналов в ваши методы.

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

Ниже приведен код, который может помочь любой, пожалуйста, помогите мне понять, вернем ли мы клонированную ссылку на адрес, тогда в любой раз мы не можем получить исходную ссылку ??

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 + "]";
}

}

...