Мелкое Копирование в Java - PullRequest
       18

Мелкое Копирование в Java

4 голосов
/ 25 апреля 2010

Я уже знаю, что такое мелкая копия, но я не могу это сделать. Вот краткий пример.

public class Shallow {
String name;
int number;

 public Shallow (Shallow s) {
  this.name = s.name;
  this.number = s.number;
 }
}

Проверка реализации ...

public class ShallowTest {
public static void main (String[] args) {
    Shallow shallow  = new Shallow("Shallow", 123);
 Shallow shallowClone = new Shallow(shallow);
    shallowClone.name = 'Peter';
    shallowClone.number = 321;
    System.out.println(shallow.name + " - " + shallow.number);
}
}

В соответствии с моим намерением, будет скопирована только ссылка на не примитивный тип данных String, так что вызовом "shallowClone.name = 'Peter';" Я бы тоже поменял название на "мелкий". Я прав? Но почему-то просто не хочет работать ....

1 Ответ

5 голосов
/ 25 апреля 2010

Строки и целые числа неизменны. Пересмотрите свою структуру данных, чтобы использовать изменяемую структуру, которая содержит ссылки, такие как массив или коллекция. Э.Г.

public class Shallow {
    private Object[] properties = new Object[2];

    public Shallow(String name, int number) {
        this.properties[0] = name;
        this.properties[1] = number;
    }

    public Shallow(Shallow s) {
        this.properties = s.properties;
    }

    public String getName() {
        return (String) properties[0];
    }

    public void setName(String name) {
        this.properties[0] = name;
    }

    public int getNumber() {
        return (Integer) properties[1];
    }

    public void setNumber(int number) {
        this.properties[1] = number;
    }
}

И используйте методы получения / установки вместо прямого доступа к свойствам.

Shallow shallow = new Shallow("Shallow", 123);
Shallow shallowClone = new Shallow(shallow);
shallowClone.setName("Peter");
shallowClone.setNumber(321);
System.out.println(shallow.getName() + " - " + shallow.getNumber()); // Peter - 321

Также обратите внимание, что строки обычно заключаются в двойные кавычки. В будущем , пожалуйста, скопируйте фактический, компилируемый и рабочий код из вашего редактора вместо того, чтобы вводить его поверх или сверху. Избегайте красных селедок.

...