Привилегированный клинт может рефлексивно вызывать приватный конструктор с помощью метода AccessibleObject.setAccessible. Если вам нужно защитить это, измените конструктор.Мой вопрос: как именно может быть вызван частный конструктор?и что такое AccessibleObject.setAccessible ??
Очевидно, что закрытый конструктор может быть вызван самим классом (например, из статического метода фабрики).Блох размышляет над тем, о чем говорит:
import java.lang.reflect.Constructor;
public class PrivateInvoker {
public static void main(String[] args) throws Exception{
//compile error
// Private p = new Private();
//works fine
Constructor<?> con = Private.class.getDeclaredConstructors()[0];
con.setAccessible(true);
Private p = (Private) con.newInstance();
}
}
class Private {
private Private() {
System.out.println("Hello!");
}
}
2. Какой подход вы, эксперты, используете с одиночками:
...
Как правило, первый является предпочтительным.Второй (при условии, что вы должны проверить, равен ли TestInstance
ноль перед возвратом нового экземпляра), получает ленивую загрузку за счет необходимости синхронизации или небезопасности потока.
Я написалвыше, когда ваш второй пример не назначил экземпляр TestInstance
при объявлении.Как уже говорилось, вышеупомянутое соображение не имеет значения.
Не является ли второй подход более гибким в случае, если нам нужно каждый раз проверять новый экземпляр или каждый раз один и тот же экземпляр?
Речь идет не о гибкости, а о стоимости создания одного (и единственного) экземпляра.Если вы делаете вариант а), это происходит во время загрузки класса.Обычно это нормально, так как класс загружается только тогда, когда это необходимо.
Я написал выше, когда ваш второй пример не назначил экземпляр TestInstance
при объявлении.Как уже говорилось, в обоих случаях синглтон будет создан при загрузке класса.
Что если я попытаюсь клонировать класс / объект?
Синглтон не должен позволятьклонирование по понятным причинам.Должно быть выброшено исключение CloneNotSupportedException, и оно будет автоматически, если только по какой-то причине вы не реализуете Cloneable
.
тип перечисления с одним элементом - лучший способ реализации синглтона.Зачем?и как?
Примеры этого приведены в книге, как и обоснования.Какую часть вы не поняли?