Файлы, управляемые git, показаны как git ls-files
. Проверьте его страницу руководства.
Оператор new
выделяет новое пространство кучи и вызывает конструктор. Таким образом вы всегда получите новый объект (если, как указали другие, в конструкторе не возникнет Exception).
Дело обстоит немного иначе со статическими методами, возвращающими ссылку, такими как Integer. valueOf ()
, который повторно использует объекты из внутреннего пула, если это возможно.
Некоторые люди говорят, что объект не будет создан, если конструктор вызовет исключение. Хочу только отметить, что это неправда. В качестве примера взгляните на этот очень плохой код:
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
КАЖДЫЙ раз создает новый объект.
Если конструктор Thing выдает исключение, объект не создается. Однако вещь
никогда не будет указывать на другой существующий экземпляр Thing.
Использование new
всегда будет приводить к выделению и созданию нового объекта. Однако вы можете иметь в виду концепцию интернирования , где объекты и хранятся в пуле и могут быть повторно использованы для экономии места. Хороший пример можно найти в статье Интернирование строк в Java.
Я не уверен, правильно ли я понял ваш вопрос.
Определение new - для выделения и инициализации нового объекта .
Я думаю, вы может сохранить статическую ссылку на объект, а затем клонировать ее, чтобы создать новый объект, но этот объект все равно будет новым.
Поскольку вы не можете изменить значение this
(в противном случае вы могли бы просто скажите что-нибудь вроде this = oldObject
в своем конструкторе), единственный способ сделать это - вызвать исключение, как уже упоминалось ранее.
new всегда создает новый объект. В java нельзя повторно использовать объект с помощью new. На самом деле это приводит к проблемам с производительностью в определенном классе Java. Например, логический класс может практически хранить только два значения (истина или ложь), тем не менее, пользователь может создавать несколько объектов с одним и тем же значением, используя new.
Новое всегда новое (возможно, с некоторыми исключениями для примитивных оболочек), но если повторное использование объектов является желаемым поведением, есть способы сделать это с помощью определенных шаблонов проектирования (синглтон, фабрика, пул и т. Д.) ).
насколько я знаю, это не похоже на C ++, где вы можете перегрузить оператор new
или выполнить размещение new или другие вещи распределителя. (но я не знаком с JLS)
Нет, если для него нет места в памяти, вы должны получить OutOfMemoryError.
Конечно, конструктор Thing может вызвать другие исключения.
Вызов new
может завершиться ошибкой, если это в первый раз, когда вы обращаетесь к классу, и если в классе есть статические блоки, которые не удается инициализировать. Я испытал поведение, при котором любые ошибки времени выполнения, возникающие в статическом блоке или конструкторе, приводят к тому, что новый вызов вызывает исключение ClassNotFound в контексте использования на сервере приложений websphere. Загрузчик классов websphere явно отклоняет загрузку класса из-за исключения времени выполнения.
Единственное, что я могу придумать в Java, - это использовать шаблон Singleton. Это не приведет к созданию нескольких новых экземпляров Thing, а, скорее, каждый раз по экземпляру одного и того же объекта.