В Java, всегда является новым новый?

Файлы, управляемые git, показаны как git ls-files. Проверьте его страницу руководства.

5
задан 2 July 2009 в 19:11
поделиться

12 ответов

Оператор new выделяет новое пространство кучи и вызывает конструктор. Таким образом вы всегда получите новый объект (если, как указали другие, в конструкторе не возникнет Exception).

Дело обстоит немного иначе со статическими методами, возвращающими ссылку, такими как Integer. valueOf () , который повторно использует объекты из внутреннего пула, если это возможно.

16
ответ дан 18 December 2019 в 05:50
поделиться

Некоторые люди говорят, что объект не будет создан, если конструктор вызовет исключение. Хочу только отметить, что это неправда. В качестве примера взгляните на этот очень плохой код:

public class Test {
    static int count;

    static Set<Test> set = new HashSet<Test>();

    int id = count++;


    public Test() {
        set.add(this);
        throw new RuntimeException();
    }


    public static void main(String[] args) throws Exception {
        for(int i = 0; i < 5; i++) {
            try {
                new Test();
            } catch(Exception e) {
            }
        }
        System.out.println(set);
    }


    public String toString() {
        return "Test[" + id + "]";
    }
}

Результат:

[Test[0], Test[1], Test[2], Test[4], Test[3]]

new КАЖДЫЙ раз создает новый объект.

4
ответ дан 18 December 2019 в 05:50
поделиться

Если конструктор Thing выдает исключение, объект не создается. Однако вещь никогда не будет указывать на другой существующий экземпляр Thing.

6
ответ дан 18 December 2019 в 05:50
поделиться

Использование new всегда будет приводить к выделению и созданию нового объекта. Однако вы можете иметь в виду концепцию интернирования , где объекты и хранятся в пуле и могут быть повторно использованы для экономии места. Хороший пример можно найти в статье Интернирование строк в Java.

3
ответ дан 18 December 2019 в 05:50
поделиться

Я не уверен, правильно ли я понял ваш вопрос.

Определение new - для выделения и инициализации нового объекта .

Я думаю, вы может сохранить статическую ссылку на объект, а затем клонировать ее, чтобы создать новый объект, но этот объект все равно будет новым.

Поскольку вы не можете изменить значение this (в противном случае вы могли бы просто скажите что-нибудь вроде this = oldObject в своем конструкторе), единственный способ сделать это - вызвать исключение, как уже упоминалось ранее.

0
ответ дан 18 December 2019 в 05:50
поделиться

new всегда создает новый объект. В java нельзя повторно использовать объект с помощью new. На самом деле это приводит к проблемам с производительностью в определенном классе Java. Например, логический класс может практически хранить только два значения (истина или ложь), тем не менее, пользователь может создавать несколько объектов с одним и тем же значением, используя new.

0
ответ дан 18 December 2019 в 05:50
поделиться

Новое всегда новое (возможно, с некоторыми исключениями для примитивных оболочек), но если повторное использование объектов является желаемым поведением, есть способы сделать это с помощью определенных шаблонов проектирования (синглтон, фабрика, пул и т. Д.) ).

1
ответ дан 18 December 2019 в 05:50
поделиться

насколько я знаю, это не похоже на C ++, где вы можете перегрузить оператор new или выполнить размещение new или другие вещи распределителя. (но я не знаком с JLS)

0
ответ дан 18 December 2019 в 05:50
поделиться

Нет, если для него нет места в памяти, вы должны получить OutOfMemoryError.

Конечно, конструктор Thing может вызвать другие исключения.

0
ответ дан 18 December 2019 в 05:50
поделиться

Нет.

0
ответ дан 18 December 2019 в 05:50
поделиться

Вызов new может завершиться ошибкой, если это в первый раз, когда вы обращаетесь к классу, и если в классе есть статические блоки, которые не удается инициализировать. Я испытал поведение, при котором любые ошибки времени выполнения, возникающие в статическом блоке или конструкторе, приводят к тому, что новый вызов вызывает исключение ClassNotFound в контексте использования на сервере приложений websphere. Загрузчик классов websphere явно отклоняет загрузку класса из-за исключения времени выполнения.

0
ответ дан 18 December 2019 в 05:50
поделиться

Единственное, что я могу придумать в Java, - это использовать шаблон Singleton. Это не приведет к созданию нескольких новых экземпляров Thing, а, скорее, каждый раз по экземпляру одного и того же объекта.

-1
ответ дан 18 December 2019 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: