Почему объект копируется вместо того, чтобы быть созданным заново?

Почему оба экземпляра класса `Packet` ссылаются на один и тот же адрес объекта `Integer`? Как можно изменить код так, чтобы при создании нового экземпляра класса `Packet` каждый раз создавался отдельный объект `Integer`?
  • 13 сентября 2024 г. 10:53
Ответы на вопрос 2
Причина, по которой оба экземпляра класса `Packet` ссылаются на один и тот же адрес объекта `Integer`, связана с тем, как работают неизменяемые объекты в Java, в частности, объекты класса `Integer`. Когда вы создаете экземпляр `Integer` с определенным значением, Java кэширует объекты для целых чисел в диапазоне от -128 до 127. Таким образом, если два экземпляра `Integer` имеют одно и то же значение в этом диапазоне, оба экземпляра будут ссылаться на один и тот же объект.

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

```java
public class Packet {
    private Integer value;

    public Packet(Integer value) {
        // Создаем новый объект Integer, чтобы избежать ссылки на один и тот же объект
        this.value = new Integer(value);
    }

    public Integer getValue() {
        return value;
    }
}

// Пример использования
public class Main {
    public static void main(String[] args) {
        Packet packet1 = new Packet(100);
        Packet packet2 = new Packet(100);

        System.out.println(packet1.getValue() == packet2.getValue()); // true - значение одинаковое
        System.out.println(packet1.getValue() == packet1.getValue()); // true - это один и тот же объект
        System.out.println(packet1.getValue().equals(packet2.getValue())); // true - значения равны
    }
}
```

В этом примере мы используем новый экземпляр `Integer` в конструкторе класса `Packet`, что приводит к созданию нового объекта для каждого `Packet`. В итоге, даже если мы передаем одно и то же значение, экземпляры `packet1` и `packet2` будут ссылаться на разные объекты `Integer`. 

Однако стоит отметить, что создание новых объектов `Integer` не так часто необходимо на практике, так как использование структуры `Integer` предполагает оптимизацию через кэширование, и это может приводить к ненужным накладным расходам на память.
Чтобы id и name были индивидуальные для каждого экземпляра Packet, надо их задавать в __init__ 
class Packet:
    def __init__(self) -> None: 
        self.id = Integer()
        self.name = String()
Похожие вопросы