Тестирую с графическим интерфейсом (совсем простеньким). Наследовал класс от JFrame, теперь нужно сделать так, что бы можно было создать только 1 объект класса. Использовал классическую схему (точнее две). Одна не сработала (ошибки посыпались), другая -> приватное статическое поле и публичный статический метод, для получения поля, если поле != null:
private static SimpleGUI simpleGUI;
public static SimpleGUI getInstance() {
if (simpleGUI == null) {
simpleGUI = new SimpleGUI("Поиск по таблицам");
}
return simpleGUI;
}
В итоге - тоже не работает.. Вот, что получается
Код и вывод, в случае, если фотка "паропадет":
Код:
private static SimpleGUI simpleGUI;
public static SimpleGUI getInstance() {
if (simpleGUI == null) {
simpleGUI = new SimpleGUI("Поиск по таблицам");
System.out.println("Создали новый " + simpleGUI.hashCode());
return simpleGUI;
}
System.out.println("Хоть 1 дойдет?))");
return simpleGUI;
}
Вывод:
Создали новый 1461149300
Создали новый 436546048
Создали новый 1150284200
Это вообще как? Я даже в synchronized блок его засовывал (по класу) и переменную как volatile помечал (хоть это и бесполезно, тут). В любом случае - создаются 3 объекта какой-то магией.. может JFrame рефлекцию использует?
P.S.: Если сразу проинициализировать поле simpleGUI и в методе getInstance() просто возвращать его - программа выбрасывает ошибку NullPointerException во время клацания на кнопочки... видимо что-то создает экземпляры еще до инициализации класса...
private static SimpleGUI simpleGUI = new SimpleGUI("Поиск по таблицам");
public static SimpleGUI getInstance() {
return simpleGUI;
}